はじめに
レコメンドシステムに携わっているので、Pythonによる推薦システムの演習問題集であるrecsys-pythonを解いてみました。
まずは1章です。
参考にしたサイトは以下です。
https://note.nkmk.me/
https://oregengo.hatenablog.com/entry/2016/03/09/132214
https://qiita.com/okkn/items/54e81346d8f35733ab5e
https://biotech-lab.org/articles/12701
01 評価履歴の生成
import numpy
Du = numpy.array([[5, 3, 1],
[6, 2, 1],
[4, 1, 1],
[8, 5, -1,],
[2, 4, -1],
[3, 6, -1],
[7, 6, -1],
[4, 2, numpy.nan],
[5, 1, numpy.nan],
[8, 6, numpy.nan],
[3, 4, numpy.nan],
[4, 7, numpy.nan],
[4, 4, numpy.nan]])
print('Du = \n{}'.format(Du))
02 評価履歴の形状
print('Duの形状 = {}'.format(Du.shape))
03 評価履歴の行数
print('Duの行数 = {}'.format(Du.shape[0]))
04 評価履歴の列数
print('Duの列数 = {}'.format(Du.shape[1]))
05 評価履歴の全要素数
print('Duの全要素数 = {}'.format(Du.size))
06 アイテム集合
I = numpy.arange(0, Du.shape[0])
print('I = {}'.format(I))
07 アイテムの特徴ベクトルの集合
x = Du[:, :2]
print('x = \n{}'.format(x))
08 アイテムiの特徴ベクトル
i = 0
print('x{} = {}'.format(i, x[0]))
09 評価値集合
ru = Du[:, 2:3].reshape(Du.shape[0])
print('ru = {}'.format(ru))
10 評価値集合の形状
print('ruの形状 = {}'.format(ru.shape))
11 評価値集合の全要素数
print('ruの全要素数 = {}'.format(ru.shape[0]))
12 評価値集合の部分集合
i = 2
j = 5
print('ru{}からru{}までの評価値 = {}'.format(i, j-1, ru[i:j]))
13 評価値集合の要素の逆順
print('ruの逆順 = {}'.format(ru[::-1]))
14 アイテムiに対する評価値
i = 0
print('ru{} = {}'.format(i, ru[i]))
15 ユーザuが未評価であるか否かの判定
print('ユーザuが未評価 = {}'.format(numpy.isnan(ru)))
16 ユーザが評価済みであるか否かの判定
print('ユーザuが評価済み = {}'.format(~numpy.isnan(ru)))
17 ユーザuが評価済みのアイテム集合
Iu = I[~numpy.isnan(ru)]
print('Iu = {}'.format(Iu))
18 ユーザuが「好き」と評価したアイテム集合
Iup = I[ru == 1]
print('Iu+ = {}'.format(Iup))
19 ユーザuが「嫌い」と評価したアイテム集合
Iun = I[ru == -1]
print('Iu- = {}'.format(Iun))
20 ユーザuが未評価のアイテム集合
Iu_not = I[numpy.isnan(ru)]
print('Iu_not = {}'.format(Iu_not))
21 訓練データ
DuL = Du[Iu]
print('DuL = \n{}'.format(DuL))
22 訓練事例数
print('|DuL| = {}'.format(DuL.shape[0]))
23 正事例数
print('|DuL+| = {}'.format(DuL[DuL[:,2]==1].shape[0]))
24 負事例数
print('|DuL-| = {}'.format(DuL[DuL[:,2]==-1].shape[0]))
25 予測対象データ
DuU = Du[Iu_not]
print('DuU = \n{}'.format(DuU))
26 予測対象事例数
print('|DuU| = {}'.format(DuU.shape[0]))
おわりに
次回は2章できたらと思っています。