View on GitHub

第1章 評価履歴 | recsys-python

Home

第1章 評価履歴

準備

次のコードを書きなさい。

import numpy as np

評価履歴

次の行列\(D_{u}\)はユーザ\(u\)の評価履歴である。

\[D_{u} = \left[ \begin{array}{rrr} 5 & 3 & +1 \\ 6 & 2 & +1 \\ 4 & 1 & +1 \\ 8 & 5 & -1 \\ 2 & 4 & -1 \\ 3 & 6 & -1 \\ 7 & 6 & -1 \\ 4 & 2 & ? \\ 5 & 1 & ? \\ 8 & 6 & ? \\ 3 & 4 & ? \\ 4 & 7 & ? \\ 4 & 4 & ? \\ \end{array} \right]\]

このとき、次の問いに答えなさい。

01 評価履歴の生成

評価履歴\(D_{u}\)をndarrayとして生成するコードを書きなさい。得られたndarrayDuとすること。

コード
【    問01    】
print('Du = \n{}'.format(Du))
結果
Du = 
[[ 5.  3.  1.]
 [ 6.  2.  1.]
 [ 4.  1.  1.]
 [ 8.  5. -1.]
 [ 2.  4. -1.]
 [ 3.  6. -1.]
 [ 7.  6. -1.]
 [ 4.  2. nan]
 [ 5.  1. nan]
 [ 8.  6. nan]
 [ 3.  4. nan]
 [ 4.  7. nan]
 [ 4.  4. nan]]

  1. numpy.array()を使う。
  2. numpy.nanを使う。

02 評価履歴の形状

Duの形状を取得するコードを書きなさい。

コード
print('Duの形状 = {}'.format(    問02    ))
結果
Duの形状 = (13, 3)

  1. ndarray.shapeを使う。

03 評価履歴の行数

Duの行数を取得するコードを書きなさい。

コード
print('Duの行数 = {}'.format(    問03    ))
結果
Duの行数 = 13

  1. ndarray.shapeを使う。

04 評価履歴の列数

Duの列数を取得するコードを書きなさい。

コード
print('Duの列数 = {}'.format(    問04    ))
結果
Duの列数 = 3

  1. ndarray.shapeを使う。

05 評価履歴の全要素数

Duの全要素数を取得するコードを書きなさい。ただし、欠損値も含む。

コード
print('Duの全要素数 = {}'.format(    問05    ))
結果
Duの全要素数 = 39

  1. ndarray.sizeを使う。

アイテム

評価履歴\(D_{u}\)の\(i\)行目はアイテム\(i \in I\)に関するデータを表す。ここで、評価履歴\(D_{u}\)に含まれるアイテム集合は\(I = \{0, 1, \ldots, 12\}\)となる。\(D_{u}\)の\(i\)行目の1列目と2列目はアイテム\(i\)の特徴ベクトル\(\boldsymbol{x}_{i}\)に対応する。このとき、次の問いに答えなさい。

06 アイテム集合

Duの各行のインデックスiは各アイテム\(i\)のアイテムID \(i\)に対応する。Duからアイテム集合\(I\)(アイテムIDを要素としたベクトル)をndarrayとして生成するコードを書きなさい。得られたndarrayIとすること。

コード
    問06    
print('I = {}'.format(I))
結果
I = [ 0  1  2  3  4  5  6  7  8  9 10 11 12]

★★

  1. numpy.arange()を使う。
  2. ndarray.shapeを使う。

07 アイテムの特徴ベクトルの集合

Duからアイテムの特徴ベクトルの集合(各アイテムの特徴ベクトル\(\boldsymbol{x}_{i}\)を縦に結合した行列)をndarrayとして生成するコードを書きなさい。得られたndarrayxとすること。

コード
    問07    
print('x = \n{}'.format(x))
結果
x = 
[[5. 3.]
 [6. 2.]
 [4. 1.]
 [8. 5.]
 [2. 4.]
 [3. 6.]
 [7. 6.]
 [4. 2.]
 [5. 1.]
 [8. 6.]
 [3. 4.]
 [4. 7.]
 [4. 4.]]

★★

  1. スライシングを使う。

08 アイテムiの特徴ベクトル

xからアイテム\(i\)の特徴ベクトル\(\boldsymbol{x}_{i}\)を取得するコードを書きなさい。

コード
i = 0
print('x{} = {}'.format(i,     問08    ))
結果
x0 = [5. 3.]

  1. インデキシングを使う。

評価値

評価履歴\(D_{u}\)の\(i\)行目3列目はユーザ\(u\)のアイテム\(i\)に対する評価値\(r_{u,i}\)に対応する。\(r_{u,i}=+1\)は「好き」を、\(r_{u,i}=-1\)は「嫌い」を表す。ただし、\(?\)はユーザ\(u\)が未評価、すなわち欠損値であることを示す。このとき、次の問いに答えなさい。

09 評価値集合

Duから評価値集合(各評価値\(r_{u,i}\)を要素としたベクトル)をndarrayとして生成するコードを書きなさい。得られたndarrayruとすること。

コード
    問09    
print('ru = {}'.format(ru))
結果
ru = [ 1.  1.  1. -1. -1. -1. -1. nan nan nan nan nan nan]

★★

  1. スライシングを使う。

10 評価値集合の形状

ruの形状を取得するコードを書きなさい。

コード
print('ruの形状 = {}'.format(    問10    ))
結果
ruの形状 = (13,)

  1. ndarray.shapeを使う。

11 評価値集合の全要素数

ruの全要素数を取得するコードを書きなさい。ただし、欠損値も含む。

コード
print('ruの全要素数 = {}'.format(    問11    ))
結果
ruの全要素数 = 13

  1. ndarray.sizeを使う。

  1. ndarray.shapeを使う。

12 評価値集合の部分集合

rui番目からj-1番目までの評価値集合を取得するコードを書きなさい。

コード
i = 2
j = 5
print('ru{}からru{}までの評価値 = {}'.format(i, j-1,     問12    ))
結果
ru2からru4までの評価値 = [ 1. -1. -1.]

  1. スライシングを使う。

13 評価値集合の要素の逆順

ruの要素を逆順に取得するコードを書きなさい。

コード
print('ruの逆順 = {}'.format(    問13    ))
結果
ruの逆順 = [nan nan nan nan nan nan -1. -1. -1. -1.  1.  1.  1.]

★★

  1. スライシングを使う。

14 アイテムiに対する評価値

ruからアイテム\(i\)に対する評価値\(r_{u,i}\)を取得するコードを書きなさい。

コード
i = 0
print('ru{} = {}'.format(i,     問14    ))
結果
ru0 = 1.0

  1. インデキシングを使う。

アイテム集合

アイテム集合\(I\)のうちユーザ\(u\)が評価済みのアイテム集合を\(I_{u} \subseteq I\)と表す。このうち、ユーザ\(u\)が「好き」と評価したアイテム集合を\(I_{u}^{+} \subseteq I\)(\(r_{u,i}=+1\)を満たすアイテム集合)、ユーザ\(u\)が「嫌い」と評価したアイテム集合を\(I_{u}^{-} \subseteq I\)(\(r_{u,i}=-1\)を満たすアイテム集合)と表す。また、ユーザ\(u\)が未評価のアイテム集合は\(\overline{I}_{u} = I \setminus I_{u}\)と表される。ここで、\(I \setminus I_{u}\)は\(I\)から\(I_{u}\)を引いた差集合を表す。このとき、次の問いに答えなさい。

15 ユーザuが未評価であるか否かの判定

ruにおいて、欠損値の要素にはTrueを、それ以外の要素にはFalseを入れたブール値配列を生成するコードを書きなさい。

コード
print('ユーザuが未評価 = {}'.format(    問15    ))
結果
ユーザuが未評価 = [False False False False False False False  True  True  True  True  True True]

  1. numpy.isnan()を使う。

16 ユーザが評価済みであるか否かの判定

ruにおいて、欠損値の要素にはFalseを、それ以外の要素にはTrueを入れたブール値配列を生成するコードを書きなさい。

コード
print('ユーザuが評価済み = {}'.format(    問16    ))
結果
ユーザuが評価済み = [ True  True  True  True  True  True  True False False False False False False]

  1. numpy.isnan()を使う。
  2. ~演算子を使う。

17 ユーザuが評価済みのアイテム集合

Iからユーザ\(u\)が評価済みのアイテム集合\(I_{u}\)をndarrayとして生成するコードを書きなさい。得られたndarrayIuとすること。

コード
    問17    
print('Iu = {}'.format(Iu))
結果
Iu = [0 1 2 3 4 5 6]

★★

  1. numpy.isnan()を使う。
  2. ~演算子を使う。
  3. ブール値インデキシングを使う。

18 ユーザuが「好き」と評価したアイテム集合

Iからユーザ\(u\)が「好き」と評価したアイテム集合\(I_{u}^{+}\)をndarrayとして生成するコードを書きなさい。得られたndarrayIupとすること。

コード
    問18    
print('Iu+ = {}'.format(Iup))
結果
Iu+ = [0 1 2]

★★

  1. ブール値インデキシングを使う。

19 ユーザuが「嫌い」と評価したアイテム集合

Iからユーザ\(u\)が「嫌い」と評価したアイテム集合\(I_{u}^{-}\)をndarrayとして生成するコードを書きなさい。得られたndarrayIunとすること。

コード
    問19    
print('Iu- = {}'.format(Iun))
結果
Iu- = [3 4 5 6]

★★

  1. ブール値インデキシングを使う。

20 ユーザuが未評価のアイテム集合

Iからユーザ\(u\)が未評価のアイテム集合\(\overline{I}_{u}\)をndarrayとして生成するコードを書きなさい。得られたndarrayIu_notとすること。

コード
    問20    
print('Iu_not = {}'.format(Iu_not))
結果
Iu_not = [ 7  8  9 10 11 12]

★★

  1. numpy.isnan()を使う。
  2. ブール値インデキシングを使う。

★★

  1. numpy.setdiff1d()を使う。

訓練データと予測対象データ

評価履歴\(D_{u}\)からユーザ\(u\)の訓練データ\(D_{u}^{L}\)を作成すると、次のとおりとなる。

\[D_{u}^{L} = \left[ \begin{array}{rrr} 5 & 3 & +1 \\ 6 & 2 & +1 \\ 4 & 1 & +1 \\ 8 & 5 & -1 \\ 2 & 4 & -1 \\ 3 & 6 & -1 \\ 7 & 6 & -1 \\ \end{array} \right]\]

ここで、訓練データ\(D_{u}^{L}\)に含まれる事例数は\(\mid D_{u}^{L} \mid = 7\)となる。また、訓練データ\(D_{u}^{L}\)のうち「好き」と評価された事例集合(正事例集合)を\(D_{u}^{L+}\)、「嫌い」と評価された事例集合(負事例集合)を\(D_{u}^{L-}\)と表す。それぞれの事例数は\(\mid D_{u}^{L+} \mid = 3\)、\(\mid D_{u}^{L-} \mid = 4\)となる。同様に、ユーザ\(u\)向けの予測対象データ\(D_{u}^{U}\)は次のとおりとなる。

\[D_{u}^{U} = \left[ \begin{array}{rrr} 4 & 2 & ? \\ 5 & 1 & ? \\ 8 & 6 & ? \\ 3 & 4 & ? \\ 4 & 7 & ? \\ 4 & 4 & ? \\ \end{array} \right]\]

ここで、予測対象データ\(D_{u}^{U}\)に含まれる事例数は\(\mid D_{u}^{U} \mid = 6\)となる。このとき、次の問いに答えなさい。

21 訓練データ

Duから訓練データ\(D_{u}^{L}\)をndarrayとして生成するコードを書きなさい。得られたndarrayDuLとすること。

コード
    問21    
print('DuL = \n{}'.format(DuL))
結果
DuL = 
[[ 5.  3.  1.]
 [ 6.  2.  1.]
 [ 4.  1.  1.]
 [ 8.  5. -1.]
 [ 2.  4. -1.]
 [ 3.  6. -1.]
 [ 7.  6. -1.]]

  1. 整数配列インデキシングを使う。

22 訓練事例数

DuLから訓練事例数\(\mid D_{u}^{L} \mid\)を取得するコードを書きなさい。

コード
print('|DuL| = {}'.format(    問22    ))
結果
|DuL| = 7

  1. ndarray.shapeを使う。

23 正事例数

DuLから正事例数\(\mid D_{u}^{L+} \mid\)を取得するコードを書きなさい。

コード
print('|DuL+| = {}'.format(    問23    ))
結果
|DuL+| = 3

★★

  1. 整数配列インデキシングを使う。
  2. ブール値インデキシングを使う。
  3. ndarray.shapeを使う。

24 負事例数

DuLから負事例数\(\mid D_{u}^{L-} \mid\)を取得するコードを書きなさい。

コード
print('|DuL-| = {}'.format(    問24    ))
結果
|DuL-| = 4

★★

  1. 整数配列インデキシングを使う。
  2. ブール値インデキシングを使う。
  3. ndarray.shapeを使う。

25 予測対象データ

Duから予測対象データ\(D_{u}^{U}\)をndarrayとして生成するコードを書きなさい。得られたndarrayDuUとすること。

コード
    問25    
print('DuU = \n{}'.format(DuU))
結果
DuU = 
[[ 4.  2. nan]
 [ 5.  1. nan]
 [ 8.  6. nan]
 [ 3.  4. nan]
 [ 4.  7. nan]
 [ 4.  4. nan]]

  1. 整数配列インデキシングを使う。

26 予測対象事例数

DuUから訓練事例数\(\mid D_{u}^{U} \mid\)を取得するコードを書きなさい。

コード
print('|DuU| = {}'.format(    問26    ))
結果
|DuU| = 6

  1. ndarray.shapeを使う。