第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
として生成するコードを書きなさい。得られたndarray
をDu
とすること。
コード
【 問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]]
★
numpy.array()
を使う。numpy.nan
を使う。
02 評価履歴の形状
Du
の形状を取得するコードを書きなさい。
コード
print('Duの形状 = {}'.format(【 問02 】))
結果
Duの形状 = (13, 3)
★
ndarray.shape
を使う。
03 評価履歴の行数
Du
の行数を取得するコードを書きなさい。
コード
print('Duの行数 = {}'.format(【 問03 】))
結果
Duの行数 = 13
★
ndarray.shape
を使う。
04 評価履歴の列数
Du
の列数を取得するコードを書きなさい。
コード
print('Duの列数 = {}'.format(【 問04 】))
結果
Duの列数 = 3
★
ndarray.shape
を使う。
05 評価履歴の全要素数
Du
の全要素数を取得するコードを書きなさい。ただし、欠損値も含む。
コード
print('Duの全要素数 = {}'.format(【 問05 】))
結果
Duの全要素数 = 39
★
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
として生成するコードを書きなさい。得られたndarray
をI
とすること。
コード
【 問06 】
print('I = {}'.format(I))
結果
I = [ 0 1 2 3 4 5 6 7 8 9 10 11 12]
★★
numpy.arange()
を使う。ndarray.shape
を使う。
07 アイテムの特徴ベクトルの集合
Du
からアイテムの特徴ベクトルの集合(各アイテムの特徴ベクトル\(\boldsymbol{x}_{i}\)を縦に結合した行列)をndarray
として生成するコードを書きなさい。得られたndarray
をx
とすること。
コード
【 問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.]]
★★
- スライシングを使う。
08 アイテムiの特徴ベクトル
x
からアイテム\(i\)の特徴ベクトル\(\boldsymbol{x}_{i}\)を取得するコードを書きなさい。
コード
i = 0
print('x{} = {}'.format(i, 【 問08 】))
結果
x0 = [5. 3.]
★
- インデキシングを使う。
評価値
評価履歴\(D_{u}\)の\(i\)行目3列目はユーザ\(u\)のアイテム\(i\)に対する評価値\(r_{u,i}\)に対応する。\(r_{u,i}=+1\)は「好き」を、\(r_{u,i}=-1\)は「嫌い」を表す。ただし、\(?\)はユーザ\(u\)が未評価、すなわち欠損値であることを示す。このとき、次の問いに答えなさい。
09 評価値集合
Du
から評価値集合(各評価値\(r_{u,i}\)を要素としたベクトル)をndarray
として生成するコードを書きなさい。得られたndarray
をru
とすること。
コード
【 問09 】
print('ru = {}'.format(ru))
結果
ru = [ 1. 1. 1. -1. -1. -1. -1. nan nan nan nan nan nan]
★★
- スライシングを使う。
10 評価値集合の形状
ru
の形状を取得するコードを書きなさい。
コード
print('ruの形状 = {}'.format(【 問10 】))
結果
ruの形状 = (13,)
★
ndarray.shape
を使う。
11 評価値集合の全要素数
ru
の全要素数を取得するコードを書きなさい。ただし、欠損値も含む。
コード
print('ruの全要素数 = {}'.format(【 問11 】))
結果
ruの全要素数 = 13
★
ndarray.size
を使う。
★
ndarray.shape
を使う。
12 評価値集合の部分集合
ru
のi
番目からj-1
番目までの評価値集合を取得するコードを書きなさい。
コード
i = 2
j = 5
print('ru{}からru{}までの評価値 = {}'.format(i, j-1, 【 問12 】))
結果
ru2からru4までの評価値 = [ 1. -1. -1.]
★
- スライシングを使う。
13 評価値集合の要素の逆順
ru
の要素を逆順に取得するコードを書きなさい。
コード
print('ruの逆順 = {}'.format(【 問13 】))
結果
ruの逆順 = [nan nan nan nan nan nan -1. -1. -1. -1. 1. 1. 1.]
★★
- スライシングを使う。
14 アイテムiに対する評価値
ru
からアイテム\(i\)に対する評価値\(r_{u,i}\)を取得するコードを書きなさい。
コード
i = 0
print('ru{} = {}'.format(i, 【 問14 】))
結果
ru0 = 1.0
★
- インデキシングを使う。
アイテム集合
アイテム集合\(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]
★
numpy.isnan()
を使う。
16 ユーザが評価済みであるか否かの判定
ru
において、欠損値の要素にはFalse
を、それ以外の要素にはTrue
を入れたブール値配列を生成するコードを書きなさい。
コード
print('ユーザuが評価済み = {}'.format(【 問16 】))
結果
ユーザuが評価済み = [ True True True True True True True False False False False False False]
★
numpy.isnan()
を使う。~
演算子を使う。
17 ユーザuが評価済みのアイテム集合
I
からユーザ\(u\)が評価済みのアイテム集合\(I_{u}\)をndarray
として生成するコードを書きなさい。得られたndarray
をIu
とすること。
コード
【 問17 】
print('Iu = {}'.format(Iu))
結果
Iu = [0 1 2 3 4 5 6]
★★
numpy.isnan()
を使う。~
演算子を使う。- ブール値インデキシングを使う。
18 ユーザuが「好き」と評価したアイテム集合
I
からユーザ\(u\)が「好き」と評価したアイテム集合\(I_{u}^{+}\)をndarray
として生成するコードを書きなさい。得られたndarray
をIup
とすること。
コード
【 問18 】
print('Iu+ = {}'.format(Iup))
結果
Iu+ = [0 1 2]
★★
- ブール値インデキシングを使う。
19 ユーザuが「嫌い」と評価したアイテム集合
I
からユーザ\(u\)が「嫌い」と評価したアイテム集合\(I_{u}^{-}\)をndarray
として生成するコードを書きなさい。得られたndarray
をIun
とすること。
コード
【 問19 】
print('Iu- = {}'.format(Iun))
結果
Iu- = [3 4 5 6]
★★
- ブール値インデキシングを使う。
20 ユーザuが未評価のアイテム集合
I
からユーザ\(u\)が未評価のアイテム集合\(\overline{I}_{u}\)をndarray
として生成するコードを書きなさい。得られたndarray
をIu_not
とすること。
コード
【 問20 】
print('Iu_not = {}'.format(Iu_not))
結果
Iu_not = [ 7 8 9 10 11 12]
★★
numpy.isnan()
を使う。- ブール値インデキシングを使う。
★★
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
として生成するコードを書きなさい。得られたndarray
をDuL
とすること。
コード
【 問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.]]
★
- 整数配列インデキシングを使う。
22 訓練事例数
DuL
から訓練事例数\(\mid D_{u}^{L} \mid\)を取得するコードを書きなさい。
コード
print('|DuL| = {}'.format(【 問22 】))
結果
|DuL| = 7
★
ndarray.shape
を使う。
23 正事例数
DuL
から正事例数\(\mid D_{u}^{L+} \mid\)を取得するコードを書きなさい。
コード
print('|DuL+| = {}'.format(【 問23 】))
結果
|DuL+| = 3
★★
- 整数配列インデキシングを使う。
- ブール値インデキシングを使う。
ndarray.shape
を使う。
24 負事例数
DuL
から負事例数\(\mid D_{u}^{L-} \mid\)を取得するコードを書きなさい。
コード
print('|DuL-| = {}'.format(【 問24 】))
結果
|DuL-| = 4
★★
- 整数配列インデキシングを使う。
- ブール値インデキシングを使う。
ndarray.shape
を使う。
25 予測対象データ
Du
から予測対象データ\(D_{u}^{U}\)をndarray
として生成するコードを書きなさい。得られたndarray
をDuU
とすること。
コード
【 問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]]
★
- 整数配列インデキシングを使う。
26 予測対象事例数
DuU
から訓練事例数\(\mid D_{u}^{U} \mid\)を取得するコードを書きなさい。
コード
print('|DuU| = {}'.format(【 問26 】))
結果
|DuU| = 6
★
ndarray.shape
を使う。