• home
  • about
  • 全ての投稿
  • ソフトウェア・ハードウェアの設定のまとめ
  • 分析関連のまとめ
  • ヘルスケア関連のまとめ
  • 生涯学習関連のまとめ

交互最小二乗法

date: 2022-03-10 excerpt: 交互最小二乗法(Alternating Least Square)について

tag: statistics機械学習als交互最小二乗法alternating least squarepython


交互最小二乗法(Alternating Least Square)について

概要

  • matrix factorizationの一つ
  • ALSと省略される
  • 便利なライブラリとしてimplicitがある
  • 確率的勾配法などではなく、user matrixとitem matrixを交互に計算することで高速に求めることを目的としている
ユーザーファクターまたはアイテムファクターのいずれかが固定されている場合、コスト関数が2次関数になるため、そのグローバル最小値を簡単に計算できることに注意してください。これにより、最小二乗法の交互最適化プロセスが実行されます。このプロセスでは、ユーザーファクターとアイテムファクターの再計算を交互に行い、各ステップでコスト関数の値を下げることが保証されます。

インストール

$ python3 -m pip install implicit

具体的な例

データのロード

%pip install implicit
import pandas as pd
import numpy as np
import scipy.sparse as sparse
import random
from datetime import datetime
import implicit 

from google.colab import drive
drive.mount('/content/drive')

IDのカテゴリ化と番号をつける

def create_data(datapath,start_date,end_date):
    df=pd.read_csv(datapath)
    df=df.assign(date=pd.Series(datetime.fromtimestamp(a/1000).date() for a in df.timestamp))
    df=df.sort_values(by='date').reset_index(drop=True) # for some reasons RetailRocket did NOT sort data by date
    df=df[(df.date>=datetime.strptime(start_date,'%Y-%m-%d').date())&(df.date<=datetime.strptime(end_date,'%Y-%m-%d').date())]
    df=df[['visitorid','itemid','event']]
    return df
datapath= '/content/drive/MyDrive/kaggle/retailrocket-ecommerce-dataset/events.csv'
data=create_data(datapath,'2015-5-3','2015-5-18')
data['user'] = data['visitorid'].astype("category")
data['artist'] = data['itemid'].astype("category")
data['user_id'] = data['user'].cat.codes
data['artist_id'] = data['artist'].cat.codes

学習

sparse_item_user = sparse.csr_matrix(([1]*len(data), (data['artist_id'], data['user_id'])))
sparse_user_item = sparse.csr_matrix(([1]*len(data), (data['user_id'], data['artist_id'])))

model = implicit.als.AlternatingLeastSquares(factors=20, regularization=0.1, iterations=5)
model.fit(sparse_item_user)

推論

# レコメンド
user_id=1
recommended = model.recommend(userid=user_id, user_items=sparse_user_item[user_id])
print(recommended)

# 似ているユーザを抽出
model.similar_users(userid=0)

Google Colab

  • alternating-least-square-example

参考

  • コードを使用した暗黙的なデータセットの交互最小二乗
    • 誤りが多い
  • github.com/benfred/implicit


statistics機械学習als交互最小二乗法alternating least squarepython Share Tweet