title | layout |
---|---|
第1章 評価履歴 | recsys-python |
default |
{% include header.html %}
次のコードを書きなさい。
import numpy as np
次の行列$$D_{u}$$はユーザ$$u$$の評価履歴である。
このとき、次の問いに答えなさい。
評価履歴$$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
を使う。
Du
の形状を取得するコードを書きなさい。
print('Duの形状 = {}'.format(【 問02 】))
Duの形状 = (13, 3)
★
ndarray.shape
を使う。
Du
の行数を取得するコードを書きなさい。
print('Duの行数 = {}'.format(【 問03 】))
Duの行数 = 13
★
ndarray.shape
を使う。
Du
の列数を取得するコードを書きなさい。
print('Duの列数 = {}'.format(【 問04 】))
Duの列数 = 3
★
ndarray.shape
を使う。
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}$$に対応する。このとき、次の問いに答えなさい。
Du
の各行のインデックスi
は各アイテム$$i$$のアイテムID 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
を使う。
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.]]
★★
- スライシングを使う。
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$$が未評価、すなわち欠損値であることを示す。このとき、次の問いに答えなさい。
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]
★★
- スライシングを使う。
ru
の形状を取得するコードを書きなさい。
print('ruの形状 = {}'.format(【 問10 】))
ruの形状 = (13,)
★
ndarray.shape
を使う。
ru
の全要素数を取得するコードを書きなさい。ただし、欠損値も含む。
print('ruの全要素数 = {}'.format(【 問11 】))
ruの全要素数 = 13
★
ndarray.size
を使う。
★
ndarray.shape
を使う。
ru
のi
番目からj-1
番目までの評価値集合を取得するコードを書きなさい。
i = 2
j = 5
print('ru{}からru{}までの評価値 = {}'.format(i, j-1, 【 問12 】))
ru2からru4までの評価値 = [ 1. -1. -1.]
★
- スライシングを使う。
ru
の要素を逆順に取得するコードを書きなさい。
print('ruの逆順 = {}'.format(【 問13 】))
ruの逆順 = [nan nan nan nan nan nan -1. -1. -1. -1. 1. 1. 1.]
★★
- スライシングを使う。
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}$$を引いた差集合を表す。このとき、次の問いに答えなさい。
ru
において、欠損値の要素にはTrue
を、それ以外の要素にはFalse
を入れたブール値配列を生成するコードを書きなさい。
print('ユーザuが未評価 = {}'.format(【 問15 】))
ユーザuが未評価 = [False False False False False False False True True True True True True]
★
numpy.isnan()
を使う。
ru
において、欠損値の要素にはFalse
を、それ以外の要素にはTrue
を入れたブール値配列を生成するコードを書きなさい。
print('ユーザuが評価済み = {}'.format(【 問16 】))
ユーザuが評価済み = [ True True True True True True True False False False False False False]
★
numpy.isnan()
を使う。~
演算子を使う。
I
からユーザ$$u$$が評価済みのアイテム集合$$I_{u}$$をndarray
として生成するコードを書きなさい。得られたndarray
をIu
とすること。
【 問17 】
print('Iu = {}'.format(Iu))
Iu = [0 1 2 3 4 5 6]
★★
numpy.isnan()
を使う。~
演算子を使う。- ブール値インデキシングを使う。
I
からユーザ$$u$$が「好き」と評価したアイテム集合$$I_{u}^{+}$$をndarray
として生成するコードを書きなさい。得られたndarray
をIup
とすること。
【 問18 】
print('Iu+ = {}'.format(Iup))
Iu+ = [0 1 2]
★★
- ブール値インデキシングを使う。
I
からユーザ$$u$$が「嫌い」と評価したアイテム集合$$I_{u}^{-}$$をndarray
として生成するコードを書きなさい。得られたndarray
をIun
とすること。
【 問19 】
print('Iu- = {}'.format(Iun))
Iu- = [3 4 5 6]
★★
- ブール値インデキシングを使う。
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}$$に含まれる事例数は$$\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}$$に含まれる事例数は$$\mid D_{u}^{U} \mid = 6$$となる。このとき、次の問いに答えなさい。
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.]]
★
- 整数配列インデキシングを使う。
DuL
から訓練事例数$$\mid D_{u}^{L} \mid$$を取得するコードを書きなさい。
print('|DuL| = {}'.format(【 問22 】))
|DuL| = 7
★
ndarray.shape
を使う。
DuL
から正事例数$$\mid D_{u}^{L+} \mid$$を取得するコードを書きなさい。
print('|DuL+| = {}'.format(【 問23 】))
|DuL+| = 3
★★
- 整数配列インデキシングを使う。
- ブール値インデキシングを使う。
ndarray.shape
を使う。
DuL
から負事例数$$\mid D_{u}^{L-} \mid$$を取得するコードを書きなさい。
print('|DuL-| = {}'.format(【 問24 】))
|DuL-| = 4
★★
- 整数配列インデキシングを使う。
- ブール値インデキシングを使う。
ndarray.shape
を使う。
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]]
★
- 整数配列インデキシングを使う。
DuU
から訓練事例数$$\mid D_{u}^{U} \mid$$を取得するコードを書きなさい。
print('|DuU| = {}'.format(【 問26 】))
|DuU| = 6
★
ndarray.shape
を使う。