Skip to content

Latest commit

 

History

History
620 lines (447 loc) · 13.2 KB

chap01.md

File metadata and controls

620 lines (447 loc) · 13.2 KB
title layout
第1章 評価履歴 | recsys-python
default

{% include header.html %}

第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とすること。

コード
問06print('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とすること。

コード
問07print('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とすること。

コード
問09print('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とすること。

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

★★

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

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

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

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

★★

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

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

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

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

★★

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

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

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

コード
問20print('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とすること。

コード
問21print('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とすること。

コード
問25print('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を使う。