pythonによるユーザーベース協調フィルタリングの実装
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
[[メモ]]
#CONTENTS
*ユーザーベース協調フィルタリング(UBCF)とは [#ya3eb525]
**普通のUBCF [#zc098f66]
ユーザーベース協調フィルタリングの流れとしてはこうです。~
①ユーザーのアイテムに対する評価値をもとに、ユーザー同士の...
②類似度の高いユーザーを何名か抽出。~
③対象ユーザの未評価アイテムについて②のユーザーの評価値か...
~
つまりは「ユーザーAに似た人ならユーザーAが好むものを好む...
という考えからユーザー同士が協調しあっているということで...
**教学データにおけるUBCF [#le2a5f4d]
普通のUBCFは購買履歴からユーザーの類似度を求めて,それか...
~
しかし,今回は教学データに対するUBCFということで,対象と...
#ref(ss11.png)
例えば上記のようなデータがあったとしたら,まず対象となる...
~
この中で学生Xと類似度が高いのは学生Aになります.~
~
そして,学生Aの理科の成績を見てみるとSを取得しています....
~
以上が教学データのUBCFの考え方です.
*実装 [#e4ca860d]
**環境 [#b5f68ba8]
・Windows10~
・Python 3.8.7
**データセット [#vb879ad8]
[[デモデータの作成]]で作った学生データを使います.
#ref(2017_02_kai.csv)
#ref(2018_02_kai.csv)
#ref(2019_02_kai.csv)
卒業済み想定の学生データ200人,在学中想定の学生データ100...
import numpy as np
import pandas as pd
data2017 = pd.read_csv("C:/Users/takky/富山県立大学/研究...
data2018 = pd.read_csv("C:/Users/takky/富山県立大学/研究...
data2019 = pd.read_csv("C:/Users/takky/富山県立大学/研究...
data_kako = pd.concat([data2018,data2017],axis = 0)
print('学籍番号を入力してください')
StudentNumber = input('入力>>>')
#学籍番号として指定された成績データをとってくる
data_ima = pd.DataFrame(data2019.iloc[int(StudentNumber)...
data_ima_T = data_ima.T
#結合
data_gutya = pd.concat([data_ima_T,data_kako],axis = 0)#...
data_all = data_gutya.reset_index(drop=True).drop('学籍...
#numpyに
data_all_np = data_all.values
学籍番号として入力された番号の学生データを取得して過去の...
~
**類似度計算 [#i96349af]
類似度計算はピアソン相関係数で求めます.類似度結果は-1~1...
#Person関数で指定した学生とすべての学生の類似度を算出
def get_correlation_coefficents(data_all_np, target_user...
similarities = []
target = data_all_np[target_user_index]
for i, score in enumerate(data_all_np):
# 共通の評価が少ない場合は除外
indices = np.where(((target + 1) * (score + 1)) ...
if len(indices) < 3 or i == target_user_index:
continue
similarity = np.corrcoef(target[indices], score[...
if np.isnan(similarity):
continue
similarities.append((i, similarity))
return sorted(similarities, key=lambda s: s[1], reve...
target_user_index = 0 # 0番目のユーザ
similarities = get_correlation_coefficents(data_all_np, ...
#0番目の学生と他の学生の類似度.(学生の行番号,類似度).1に...
print('Similarities: {}'.format(similarities))
**予測 [#xbe2d7dc]
予測評価値の算出を行います.今回の場合予測評価値は0~4の...
#予測評価値を求める
def predict(data_all_np, similarities, target_user_index...
target = data_all_np[target_user_index]
avg_target = np.mean(target[np.where(target >= 0)])
numerator = 0.0
denominator = 0.0
k = 0
for similarity in similarities:
# 類似度の上位10人の評価値を使う
if k > 10 or similarity[1] <= 0.0:
break
score = data_all_np[similarity[0]]
if score[target_item_index] >= 0:
denominator += similarity[1]
numerator += similarity[1] * (score[target_i...
k += 1
return avg_target + (numerator / denominator) if den...
#target_item_index = 25
print('Predict score: {:.3f}'.format(predict(data_all_np...
**ランキング [#l706387e]
予測評価値を元にランク付けします.
#予測評価値をもとにランキング
def rank_items(data_all_np, similarities, target_user_in...
rankings = []
target = data_all_np[target_user_index]
for i in range(127):
# 既に取得済みの科目はスキップ
if target[i] >= 0:
continue
rankings.append((i, predict(data_all_np, similar...
return sorted(rankings, key=lambda r: r[1], reverse=...
target_user_index = 0 # 0番目のユーザ
rank = rank_items(data_all_np, similarities, target_user...
#print('Ranking: {}'.format(rank))
rank_df = pd.DataFrame(rank,columns=['index','predict'])
for i in range(len(rank_df.index)):
rank_df = rank_df.replace({'index':{rank_df.iloc[i,0...
print(rank_df)
#ref(ss1.png)
ランキングによりプログラミング演習2を推薦するのが良いとわ...
*まとめ [#l835aeda]
#ref(UBCF.py)
上記の説明をまとめたコードです.デモデータと同じディレク...
python UBCF.py
で動きます~
~
学籍番号は1915001~1915100までの範囲で入力してください🙏
終了行:
[[メモ]]
#CONTENTS
*ユーザーベース協調フィルタリング(UBCF)とは [#ya3eb525]
**普通のUBCF [#zc098f66]
ユーザーベース協調フィルタリングの流れとしてはこうです。~
①ユーザーのアイテムに対する評価値をもとに、ユーザー同士の...
②類似度の高いユーザーを何名か抽出。~
③対象ユーザの未評価アイテムについて②のユーザーの評価値か...
~
つまりは「ユーザーAに似た人ならユーザーAが好むものを好む...
という考えからユーザー同士が協調しあっているということで...
**教学データにおけるUBCF [#le2a5f4d]
普通のUBCFは購買履歴からユーザーの類似度を求めて,それか...
~
しかし,今回は教学データに対するUBCFということで,対象と...
#ref(ss11.png)
例えば上記のようなデータがあったとしたら,まず対象となる...
~
この中で学生Xと類似度が高いのは学生Aになります.~
~
そして,学生Aの理科の成績を見てみるとSを取得しています....
~
以上が教学データのUBCFの考え方です.
*実装 [#e4ca860d]
**環境 [#b5f68ba8]
・Windows10~
・Python 3.8.7
**データセット [#vb879ad8]
[[デモデータの作成]]で作った学生データを使います.
#ref(2017_02_kai.csv)
#ref(2018_02_kai.csv)
#ref(2019_02_kai.csv)
卒業済み想定の学生データ200人,在学中想定の学生データ100...
import numpy as np
import pandas as pd
data2017 = pd.read_csv("C:/Users/takky/富山県立大学/研究...
data2018 = pd.read_csv("C:/Users/takky/富山県立大学/研究...
data2019 = pd.read_csv("C:/Users/takky/富山県立大学/研究...
data_kako = pd.concat([data2018,data2017],axis = 0)
print('学籍番号を入力してください')
StudentNumber = input('入力>>>')
#学籍番号として指定された成績データをとってくる
data_ima = pd.DataFrame(data2019.iloc[int(StudentNumber)...
data_ima_T = data_ima.T
#結合
data_gutya = pd.concat([data_ima_T,data_kako],axis = 0)#...
data_all = data_gutya.reset_index(drop=True).drop('学籍...
#numpyに
data_all_np = data_all.values
学籍番号として入力された番号の学生データを取得して過去の...
~
**類似度計算 [#i96349af]
類似度計算はピアソン相関係数で求めます.類似度結果は-1~1...
#Person関数で指定した学生とすべての学生の類似度を算出
def get_correlation_coefficents(data_all_np, target_user...
similarities = []
target = data_all_np[target_user_index]
for i, score in enumerate(data_all_np):
# 共通の評価が少ない場合は除外
indices = np.where(((target + 1) * (score + 1)) ...
if len(indices) < 3 or i == target_user_index:
continue
similarity = np.corrcoef(target[indices], score[...
if np.isnan(similarity):
continue
similarities.append((i, similarity))
return sorted(similarities, key=lambda s: s[1], reve...
target_user_index = 0 # 0番目のユーザ
similarities = get_correlation_coefficents(data_all_np, ...
#0番目の学生と他の学生の類似度.(学生の行番号,類似度).1に...
print('Similarities: {}'.format(similarities))
**予測 [#xbe2d7dc]
予測評価値の算出を行います.今回の場合予測評価値は0~4の...
#予測評価値を求める
def predict(data_all_np, similarities, target_user_index...
target = data_all_np[target_user_index]
avg_target = np.mean(target[np.where(target >= 0)])
numerator = 0.0
denominator = 0.0
k = 0
for similarity in similarities:
# 類似度の上位10人の評価値を使う
if k > 10 or similarity[1] <= 0.0:
break
score = data_all_np[similarity[0]]
if score[target_item_index] >= 0:
denominator += similarity[1]
numerator += similarity[1] * (score[target_i...
k += 1
return avg_target + (numerator / denominator) if den...
#target_item_index = 25
print('Predict score: {:.3f}'.format(predict(data_all_np...
**ランキング [#l706387e]
予測評価値を元にランク付けします.
#予測評価値をもとにランキング
def rank_items(data_all_np, similarities, target_user_in...
rankings = []
target = data_all_np[target_user_index]
for i in range(127):
# 既に取得済みの科目はスキップ
if target[i] >= 0:
continue
rankings.append((i, predict(data_all_np, similar...
return sorted(rankings, key=lambda r: r[1], reverse=...
target_user_index = 0 # 0番目のユーザ
rank = rank_items(data_all_np, similarities, target_user...
#print('Ranking: {}'.format(rank))
rank_df = pd.DataFrame(rank,columns=['index','predict'])
for i in range(len(rank_df.index)):
rank_df = rank_df.replace({'index':{rank_df.iloc[i,0...
print(rank_df)
#ref(ss1.png)
ランキングによりプログラミング演習2を推薦するのが良いとわ...
*まとめ [#l835aeda]
#ref(UBCF.py)
上記の説明をまとめたコードです.デモデータと同じディレク...
python UBCF.py
で動きます~
~
学籍番号は1915001~1915100までの範囲で入力してください🙏
ページ名: