質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.32%

類似度が高い上位20人を抽出する部分の書き方がわからない

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,877
退会済みユーザー

退会済みユーザー

レコメンドシステムを作りたいのですが、類似度が高い上位20人を抽出する部分の書き方がわかりません。
全体のコードが

from __future__ import print_function

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import scipy.spatial as sp
import scipy.sparse as sparse
from sklearn.decomposition import NMF, TruncatedSVD

data = pd.read_csv('user_topic_follow_dummy.csv', encoding='utf8')
data.drop_duplicates(keep='last', inplace=True)
data.head()

data['rating'] = 1.0
rating_matrix = data.pivot(index='user_id', columns='topic_name', values='rating')
rating_matrix.fillna(0, inplace=True)
topic_list = np.array(rating_matrix.columns)
user_list = np.array(rating_matrix.index)
rating_matrix_ar = np.array(rating_matrix)
print(data[data['user_id'] == user_list[0]])
already_followed_topic =np.array(data[data['user_id'] == user_list[0]]['topic_name'])


def get_cosine_similarity(x, y):
    return 1- sp.distance.cosine(x, y)

#ジャッカード係数
def get_jaccard_similarity(x, y):
    return 1 - sp.distance.jaccard(x, y)

user_similarity = []
target_user_row = rating_matrix_ar[0]
for row in rating_matrix_ar:
    sim = get_jaccard_similarity(target_user_row, row)
    user_similarity.append(sim)
user_similarity = np.array(user_similarity)

#類似度が高い上位20人を抽出
topN = 20
idx = user_similarity.argsort()[::-1][1:topN+1]
selected_user_similarity = user_similarity[idx]
selected_rating = rating_matrix_ar[idx]

#平均類似度を計算
avg_score = []

for col_idx in range(selected_rating.shape[1]):
    weight_score = sum(selected_rating[:, col_idx] * selected_user_similarity)
    similarity_sum =sum(selected_user_similarity[selected_user_similarity > 0])
    avg_score.append(weight_score / similarity_sum)
avg_score = np.array(avg_score)
#平均類似度の高い上位5テーマを表示
recommend_num = 5
counter = 0
for recommended_topic in topic_list[avg_score.argsort()[::-1]]:
    if recommended_topic not in already_followed_topic:
        print(recommended_topic)
        counter += 1
        if recommend_num <= counter:
            break


argsort関数は昇順にソートしたインデックスの配列を返すし、[::-1]というスライスの書き方を使って降順にしているのはわかります。
でもその結果を

selected_user_similarity = user_similarity[idx]
selected_rating = rating_matrix_ar[idx]


の両方に入れている点がわかりません。
どうして違う変数に、インデックスに同じものを入れた違う配列を入れているのでしょうか?また、どうして

topN = 20
idx = user_similarity.argsort()[::-1][1:topN+1]
selected_user_similarity = user_similarity[idx]
selected_rating = rating_matrix_ar[idx]


ここの部分で類似度が高い上位20人を抽出できるのでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yoorwm

    2017/06/13 09:55

    コメントがあるのに、そのコメントに対して質問をしている、という事は、ご自身で書いたコードではなくて、どこかから引用されたのでしょうか?引用をした場合は、引用元の情報があるべきかと思います。

    キャンセル

  • 退会済みユーザー

    キャンセル

回答 1

checkベストアンサー

0

式を分解すると分かりやすいです。

idx = user_similarity.argsort()[::-1] ではリストを逆順=類似している順にならべて
idx = idx[1:topN+1] で先頭=[0]=自分を除くtopN人の行番号を抽出しています。

参考:[python] スライスでリバース!!

また、
selected_user_similarity = user_similarity[idx] はtopN人の各類似度
selected_rating = rating_matrix_ar[idx]はtopN人の各アイテム?リストを表しています。

これらの変数は、後の#平均類似度を計算で利用しています。
なお、mlbook/chapter05/レコメンデーション入門.ipynbに分かりやすい説明が書いています。

 捕捉

この手のコードの意味を訪ねる質問は、質問者がコードの意味をある程度把握しており、なおかつ第三者が動作を確認できる(動く)コードを提示しないと、回答得られにくいです。

フリーライブラリで学ぶ機械学習入門 サンプルコード

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.32%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る