# 協調フィルタリングモジュール collab と推奨システム D-Recommend


<!-- WARNING: THIS FILE WAS AUTOGENERATED! DO NOT EDIT! -->

![](04recommender_files/figure-commonmark/cell-4-output-1.jpeg)

## 映画（rating)データの読み込み

Movie Lensのデータセット https://grouplens.org/datasets/movielens/
を用いる．

まずは映画のレイティング(rating）データを読み込む．

``` python
path = untar_data(URLs.ML_100k)
ratings = pd.read_csv(path/'u.data', delimiter='\t', header=None,
                      usecols=(0,1,2), names=['user','movie','rating'])
ratings.head()
```

<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }
&#10;    .dataframe tbody tr th {
        vertical-align: top;
    }
&#10;    .dataframe thead th {
        text-align: right;
    }
</style>

<table class="dataframe" data-quarto-postprocess="true" data-border="1">
<thead>
<tr style="text-align: right;">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">user</th>
<th data-quarto-table-cell-role="th">movie</th>
<th data-quarto-table-cell-role="th">rating</th>
</tr>
</thead>
<tbody>
<tr>
<td data-quarto-table-cell-role="th">0</td>
<td>196</td>
<td>242</td>
<td>3</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">1</td>
<td>186</td>
<td>302</td>
<td>3</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">2</td>
<td>22</td>
<td>377</td>
<td>1</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">3</td>
<td>244</td>
<td>51</td>
<td>2</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">4</td>
<td>166</td>
<td>346</td>
<td>1</td>
</tr>
</tbody>
</table>

</div>

映画のデータも読み込む． movie列がratingデータと共有であり，
ratingデータにマージすることによって映画のタイトル列を追加する．

``` python
movies = pd.read_csv(path/'u.item',  delimiter='|', encoding='latin-1',
                     usecols=(0,1), names=('movie','title'), header=None)
movies.set_index("movie",inplace=True)
```

``` python
movies.reset_index(inplace=True)
ratings = ratings.merge(movies)
ratings.head()
```

<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }
&#10;    .dataframe tbody tr th {
        vertical-align: top;
    }
&#10;    .dataframe thead th {
        text-align: right;
    }
</style>

<table class="dataframe" data-quarto-postprocess="true" data-border="1">
<thead>
<tr style="text-align: right;">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">user</th>
<th data-quarto-table-cell-role="th">movie</th>
<th data-quarto-table-cell-role="th">rating</th>
<th data-quarto-table-cell-role="th">title</th>
</tr>
</thead>
<tbody>
<tr>
<td data-quarto-table-cell-role="th">0</td>
<td>196</td>
<td>242</td>
<td>3</td>
<td>Kolya (1996)</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">1</td>
<td>63</td>
<td>242</td>
<td>3</td>
<td>Kolya (1996)</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">2</td>
<td>226</td>
<td>242</td>
<td>5</td>
<td>Kolya (1996)</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">3</td>
<td>154</td>
<td>242</td>
<td>3</td>
<td>Kolya (1996)</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">4</td>
<td>306</td>
<td>242</td>
<td>5</td>
<td>Kolya (1996)</td>
</tr>
</tbody>
</table>

</div>

ユーザーデータを準備する．
Fakerパッケージを使って架空のユーザーを生成し，ratingデータに追加する．

``` python
user = list(set(ratings.user))
movie = list(set(ratings.movie))
print(len(user),len(movie))
fake = Faker(['en_US', 'ja_JP','zh_CN','ko_KR'])
Faker.seed(1)
name_dic ={}
for i in user:
    name_dic[i] = fake.name() 
#name_dic
```

    943 1682

``` python
#名前の追加
user = list(set(ratings.user))
movie = list(set(ratings.movie))
print(len(user),len(movie))
fake = Faker(['en_US', 'ja_JP','zh_CN','ko_KR'])
Faker.seed(1)
name_dic ={}
for i in user:
    name_dic[i] = fake.name() 
name =[]
for i in ratings.user:
    name.append( name_dic[i])
ratings["name"] = name
```

    943 1682

``` python
ratings.columns =["user","movie","rating","title","name"]
ratings_df = ratings.reindex(columns= ["user","name", "movie","title","rating"])
#ratings_df.to_csv(folder+"rating.csv", index=False)
ratings_df
```

<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }
&#10;    .dataframe tbody tr th {
        vertical-align: top;
    }
&#10;    .dataframe thead th {
        text-align: right;
    }
</style>

<table class="dataframe" data-quarto-postprocess="true" data-border="1">
<thead>
<tr style="text-align: right;">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">user</th>
<th data-quarto-table-cell-role="th">name</th>
<th data-quarto-table-cell-role="th">movie</th>
<th data-quarto-table-cell-role="th">title</th>
<th data-quarto-table-cell-role="th">rating</th>
</tr>
</thead>
<tbody>
<tr>
<td data-quarto-table-cell-role="th">0</td>
<td>196</td>
<td>윤정식</td>
<td>242</td>
<td>Kolya (1996)</td>
<td>3</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">1</td>
<td>63</td>
<td>商畅</td>
<td>242</td>
<td>Kolya (1996)</td>
<td>3</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">2</td>
<td>226</td>
<td>吴波</td>
<td>242</td>
<td>Kolya (1996)</td>
<td>5</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">3</td>
<td>154</td>
<td>Edward Wright</td>
<td>242</td>
<td>Kolya (1996)</td>
<td>3</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">4</td>
<td>306</td>
<td>Scott Lawrence</td>
<td>242</td>
<td>Kolya (1996)</td>
<td>5</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">99995</td>
<td>840</td>
<td>Jesse Torres</td>
<td>1674</td>
<td>Mamma Roma (1962)</td>
<td>4</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">99996</td>
<td>655</td>
<td>井上 拓真</td>
<td>1640</td>
<td>Eighth Day, The (1996)</td>
<td>3</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">99997</td>
<td>655</td>
<td>井上 拓真</td>
<td>1637</td>
<td>Girls Town (1996)</td>
<td>3</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">99998</td>
<td>655</td>
<td>井上 拓真</td>
<td>1630</td>
<td>Silence of the Palace, The (Saimt el Qusur) (1994)</td>
<td>3</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">99999</td>
<td>655</td>
<td>井上 拓真</td>
<td>1641</td>
<td>Dadetown (1995)</td>
<td>3</td>
</tr>
</tbody>
</table>

<p>100000 rows × 5 columns</p>
</div>

``` python
users = pd.DataFrame( {"id": user, "name": [name_dic[i] for i in user]} )
#users.to_csv(folder+"users.csv",index=False)
```

## 分析

上で生成したratingデータ（ユーザー名と映画タイトル追加済み）を読み込む．

``` python
ratings_df = pd.read_csv(folder+"rating.csv")
ratings_df.head()
```

<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }
&#10;    .dataframe tbody tr th {
        vertical-align: top;
    }
&#10;    .dataframe thead th {
        text-align: right;
    }
</style>

<table class="dataframe" data-quarto-postprocess="true" data-border="1">
<thead>
<tr style="text-align: right;">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">user</th>
<th data-quarto-table-cell-role="th">name</th>
<th data-quarto-table-cell-role="th">movie</th>
<th data-quarto-table-cell-role="th">title</th>
<th data-quarto-table-cell-role="th">rating</th>
</tr>
</thead>
<tbody>
<tr>
<td data-quarto-table-cell-role="th">0</td>
<td>196</td>
<td>张颖</td>
<td>242</td>
<td>Kolya (1996)</td>
<td>3</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">1</td>
<td>63</td>
<td>우정자</td>
<td>242</td>
<td>Kolya (1996)</td>
<td>3</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">2</td>
<td>226</td>
<td>James Anderson</td>
<td>242</td>
<td>Kolya (1996)</td>
<td>5</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">3</td>
<td>154</td>
<td>李建国</td>
<td>242</td>
<td>Kolya (1996)</td>
<td>3</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">4</td>
<td>306</td>
<td>宋峰</td>
<td>242</td>
<td>Kolya (1996)</td>
<td>5</td>
</tr>
</tbody>
</table>

</div>

映画の平均レイティングを計算する．

``` python
movies_df = pd.read_csv(folder+"movies.csv")
ave_rate = pd.pivot_table(ratings_df, index="movie", values="rating", aggfunc= "mean")
movies_df["average rating"] = list(ave_rate.rating)
movies_df.head()
```

<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }
&#10;    .dataframe tbody tr th {
        vertical-align: top;
    }
&#10;    .dataframe thead th {
        text-align: right;
    }
</style>

<table class="dataframe" data-quarto-postprocess="true" data-border="1">
<thead>
<tr style="text-align: right;">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">movie</th>
<th data-quarto-table-cell-role="th">title</th>
<th data-quarto-table-cell-role="th">average rating</th>
</tr>
</thead>
<tbody>
<tr>
<td data-quarto-table-cell-role="th">0</td>
<td>1</td>
<td>Toy Story (1995)</td>
<td>3.878319</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">1</td>
<td>2</td>
<td>GoldenEye (1995)</td>
<td>3.206107</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">2</td>
<td>3</td>
<td>Four Rooms (1995)</td>
<td>3.033333</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">3</td>
<td>4</td>
<td>Get Shorty (1995)</td>
<td>3.550239</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">4</td>
<td>5</td>
<td>Copycat (1995)</td>
<td>3.302326</td>
</tr>
</tbody>
</table>

</div>

ユーザーごとの平均レイティングを計算する．

``` python
users_df = pd.read_csv(folder+"users.csv")
ave_user = pd.pivot_table(ratings_df, index="user", values="rating", aggfunc= "mean")
users_df["average rating"] = list(ave_user.rating)
users_df.head(11)
```

<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }
&#10;    .dataframe tbody tr th {
        vertical-align: top;
    }
&#10;    .dataframe thead th {
        text-align: right;
    }
</style>

<table class="dataframe" data-quarto-postprocess="true" data-border="1">
<thead>
<tr style="text-align: right;">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">id</th>
<th data-quarto-table-cell-role="th">name</th>
<th data-quarto-table-cell-role="th">average rating</th>
</tr>
</thead>
<tbody>
<tr>
<td data-quarto-table-cell-role="th">0</td>
<td>1</td>
<td>Ryan Gallagher</td>
<td>3.610294</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">1</td>
<td>2</td>
<td>박영길</td>
<td>3.709677</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">2</td>
<td>3</td>
<td>後藤 あすか</td>
<td>2.796296</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">3</td>
<td>4</td>
<td>Russell Reynolds</td>
<td>4.333333</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">4</td>
<td>5</td>
<td>佐藤 七夏</td>
<td>2.874286</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">5</td>
<td>6</td>
<td>伊藤 陽子</td>
<td>3.635071</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">6</td>
<td>7</td>
<td>김경자</td>
<td>3.965261</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">7</td>
<td>8</td>
<td>Teresa James</td>
<td>3.796610</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">8</td>
<td>9</td>
<td>이경수</td>
<td>4.272727</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">9</td>
<td>10</td>
<td>徐娟</td>
<td>4.206522</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">10</td>
<td>11</td>
<td>刘龙</td>
<td>3.464088</td>
</tr>
</tbody>
</table>

</div>

## 学習器の生成と訓練を行う関数 colab_learn

------------------------------------------------------------------------

<a
href="https://github.com/scmopt/manual/tree/master/blob/master/scmopt/collab.py#L18"
target="_blank" style="float:right; font-size:smaller">source</a>

### colab_learn

``` python

def colab_learn(
    ratings_df
):

```

*Call self as a function.*

### colab_learnの使用例

``` python
learn = colab_learn(ratings_df)
```

<table class="dataframe" data-quarto-postprocess="true" data-border="1">
<thead>
<tr style="text-align: left;">
<th data-quarto-table-cell-role="th">epoch</th>
<th data-quarto-table-cell-role="th">train_loss</th>
<th data-quarto-table-cell-role="th">valid_loss</th>
<th data-quarto-table-cell-role="th">time</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>0.900057</td>
<td>0.917428</td>
<td>00:06</td>
</tr>
<tr>
<td>1</td>
<td>0.865561</td>
<td>0.850833</td>
<td>00:06</td>
</tr>
<tr>
<td>2</td>
<td>0.735190</td>
<td>0.805221</td>
<td>00:06</td>
</tr>
<tr>
<td>3</td>
<td>0.612931</td>
<td>0.789337</td>
<td>00:06</td>
</tr>
<tr>
<td>4</td>
<td>0.499000</td>
<td>0.788837</td>
<td>00:06</td>
</tr>
</tbody>
</table>

``` python
preds0, target0, decoded0, loss0 = learn.get_preds(ds_idx=0, with_decoded=True, with_loss=True)
loss0
```

    TensorBase([0.1374, 0.1485, 0.1860,  ..., 1.0949, 0.2373, 1.2814])

\#hide レイティングの上位 100 の映画を抽出しておく．

## 予測を行う関数 colab_predict

------------------------------------------------------------------------

<a
href="https://github.com/scmopt/manual/tree/master/blob/master/scmopt/collab.py#L26"
target="_blank" style="float:right; font-size:smaller">source</a>

### colab_predict

``` python

def colab_predict(
    learn, movies_df, user_id
):

```

*Call self as a function.*

### colab_predict関数の使用例

user_idが10のユーザーに対する推奨映画

``` python
recommend_df = colab_predict(learn, movies_df, user_id=10)
```

``` python
recommend_df.head()
```

<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }
&#10;    .dataframe tbody tr th {
        vertical-align: top;
    }
&#10;    .dataframe thead th {
        text-align: right;
    }
</style>

<table class="dataframe" data-quarto-postprocess="true" data-border="1">
<thead>
<tr style="text-align: right;">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">movie</th>
<th data-quarto-table-cell-role="th">recommend movie</th>
<th data-quarto-table-cell-role="th">rating</th>
</tr>
</thead>
<tbody>
<tr>
<td data-quarto-table-cell-role="th">317</td>
<td>318</td>
<td>Schindler's List (1993)</td>
<td>4.820768</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">126</td>
<td>127</td>
<td>Godfather, The (1972)</td>
<td>4.793285</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">356</td>
<td>357</td>
<td>One Flew Over the Cuckoo's Nest (1975)</td>
<td>4.766077</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">131</td>
<td>132</td>
<td>Wizard of Oz, The (1939)</td>
<td>4.755078</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">133</td>
<td>134</td>
<td>Citizen Kane (1941)</td>
<td>4.741590</td>
</tr>
</tbody>
</table>

</div>

このユーザーのレイティングを確認する．

``` python
ratings_df[ ratings_df.user==10 ].head()
```

<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }
&#10;    .dataframe tbody tr th {
        vertical-align: top;
    }
&#10;    .dataframe thead th {
        text-align: right;
    }
</style>

<table class="dataframe" data-quarto-postprocess="true" data-border="1">
<thead>
<tr style="text-align: right;">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">user</th>
<th data-quarto-table-cell-role="th">name</th>
<th data-quarto-table-cell-role="th">movie</th>
<th data-quarto-table-cell-role="th">title</th>
<th data-quarto-table-cell-role="th">rating</th>
</tr>
</thead>
<tbody>
<tr>
<td data-quarto-table-cell-role="th">177</td>
<td>10</td>
<td>徐娟</td>
<td>302</td>
<td>L.A. Confidential (1997)</td>
<td>4</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">676</td>
<td>10</td>
<td>徐娟</td>
<td>474</td>
<td>Dr. Strangelove or: How I Learned to Stop Worrying and Love the Bomb
(1963)</td>
<td>4</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">2276</td>
<td>10</td>
<td>徐娟</td>
<td>40</td>
<td>To Wong Foo, Thanks for Everything! Julie Newmar (1995)</td>
<td>4</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">2559</td>
<td>10</td>
<td>徐娟</td>
<td>274</td>
<td>Sabrina (1995)</td>
<td>4</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">2798</td>
<td>10</td>
<td>徐娟</td>
<td>486</td>
<td>Sabrina (1954)</td>
<td>4</td>
</tr>
</tbody>
</table>

</div>

## 可視化

### アイテム（映画）を2次元に可視化する関数 show_item_map

------------------------------------------------------------------------

<a
href="https://github.com/scmopt/manual/tree/master/blob/master/scmopt/collab.py#L35"
target="_blank" style="float:right; font-size:smaller">source</a>

### show_item_map

``` python

def show_item_map(
    learn, movies_df
):

```

*Call self as a function.*

### show_item_map関数の使用例

``` python
fig, movies = show_item_map(learn, movies_df)
plotly.offline.plot(fig);
movies.head()
```

<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }
&#10;    .dataframe tbody tr th {
        vertical-align: top;
    }
&#10;    .dataframe thead th {
        text-align: right;
    }
</style>

<table class="dataframe" data-quarto-postprocess="true" data-border="1">
<thead>
<tr style="text-align: right;">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">movie</th>
<th data-quarto-table-cell-role="th">title</th>
<th data-quarto-table-cell-role="th">average rating</th>
<th data-quarto-table-cell-role="th">PCA1</th>
<th data-quarto-table-cell-role="th">PCA2</th>
<th data-quarto-table-cell-role="th">PCA3</th>
</tr>
</thead>
<tbody>
<tr>
<td data-quarto-table-cell-role="th">0</td>
<td>1</td>
<td>Toy Story (1995)</td>
<td>3.878319</td>
<td>0.444091</td>
<td>0.520046</td>
<td>-0.033139</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">1</td>
<td>2</td>
<td>GoldenEye (1995)</td>
<td>3.206107</td>
<td>-0.039345</td>
<td>0.377593</td>
<td>0.204351</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">2</td>
<td>3</td>
<td>Four Rooms (1995)</td>
<td>3.033333</td>
<td>-0.270448</td>
<td>0.101434</td>
<td>0.574822</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">3</td>
<td>4</td>
<td>Get Shorty (1995)</td>
<td>3.550239</td>
<td>0.457936</td>
<td>0.075438</td>
<td>0.199581</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">4</td>
<td>5</td>
<td>Copycat (1995)</td>
<td>3.302326</td>
<td>-0.138418</td>
<td>0.573008</td>
<td>-0.084740</td>
</tr>
</tbody>
</table>

</div>

![](04recommender_files/figure-commonmark/cell-26-output-1.png)

### ユーザーを2次元に可視化する関数 show_user_map

------------------------------------------------------------------------

<a
href="https://github.com/scmopt/manual/tree/master/blob/master/scmopt/collab.py#L46"
target="_blank" style="float:right; font-size:smaller">source</a>

### show_user_map

``` python

def show_user_map(
    learn, users_df
):

```

*Call self as a function.*

### show_user_map関数の使用例

``` python
fig, users = show_user_map(learn, users_df)
plotly.offline.plot(fig);
users.head()
```

<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }
&#10;    .dataframe tbody tr th {
        vertical-align: top;
    }
&#10;    .dataframe thead th {
        text-align: right;
    }
</style>

<table class="dataframe" data-quarto-postprocess="true" data-border="1">
<thead>
<tr style="text-align: right;">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">id</th>
<th data-quarto-table-cell-role="th">name</th>
<th data-quarto-table-cell-role="th">average rating</th>
<th data-quarto-table-cell-role="th">PCA1</th>
<th data-quarto-table-cell-role="th">PCA2</th>
<th data-quarto-table-cell-role="th">PCA3</th>
</tr>
</thead>
<tbody>
<tr>
<td data-quarto-table-cell-role="th">0</td>
<td>1</td>
<td>Ryan Gallagher</td>
<td>3.610294</td>
<td>0.540301</td>
<td>-0.043214</td>
<td>-0.551639</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">1</td>
<td>2</td>
<td>박영길</td>
<td>3.709677</td>
<td>0.215085</td>
<td>-0.478103</td>
<td>-0.068856</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">2</td>
<td>3</td>
<td>後藤 あすか</td>
<td>2.796296</td>
<td>0.225072</td>
<td>0.370120</td>
<td>-0.026158</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">3</td>
<td>4</td>
<td>Russell Reynolds</td>
<td>4.333333</td>
<td>-0.085290</td>
<td>0.185153</td>
<td>-0.412719</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">4</td>
<td>5</td>
<td>佐藤 七夏</td>
<td>2.874286</td>
<td>0.451194</td>
<td>0.577116</td>
<td>-0.321961</td>
</tr>
</tbody>
</table>

</div>

![](04recommender_files/figure-commonmark/cell-29-output-1.png)

### ユーザーへの推奨アイテムを可視化する関数 show_recommend

------------------------------------------------------------------------

<a
href="https://github.com/scmopt/manual/tree/master/blob/master/scmopt/collab.py#L57"
target="_blank" style="float:right; font-size:smaller">source</a>

### show_recommend

``` python

def show_recommend(
    learn, movies_df, recommend_df, best:int=100
):

```

*Call self as a function.*

``` python
fig = show_recommend(learn, movies_df, recommend_df, best=100)
plotly.offline.plot(fig);
```

![](04recommender_files/figure-commonmark/cell-32-output-1.png)

![](04recommender_files/figure-commonmark/cell-34-output-1.png)
