가장 간단 한 추천 시스템 실천

5599 단어 mlalgorithm
네트워크 의 일부 자 료 를 참고 하여 가장 간단 한 추천 시스템 의 demo 인 스 턴 스 를 만 들 었 습 니 다.저 희 는 MovieLens 데이터 세트 를 사용 할 것 입 니 다.추천 엔진 을 실현 하고 테스트 할 때 사용 하 는 가장 흔 한 데이터 세트 중 하나 로 943 명의 사용자 와 정 선 된 1682 편의 영화 의 평 점 을 포함 합 니 다.데이터 다운로드 주소:http://grouplens.org/datasets/movielens/,위 에 가서 관련 데 이 터 를 다운로드 할 수 있 습 니 다.
코드 를 직접 올 리 고 구체 적 인 설명 은 주석 에 있 습 니 다.
#!/usr/bin/env python
#coding:utf-8

import numpy as np
import pandas as pd
import time
from sklearn import cross_validation as cv
from sklearn.metrics.pairwise import pairwise_distances
from sklearn.metrics import mean_squared_error
from math import sqrt

def read_file():

    header = ['user_id', 'item_id', 'rating', 'timestamp']
    df = pd.read_csv("/Users/lei.wang/data/ml-100k/u.data",sep = '\t',names = header)
    #          ,       ,     943 1682
    n_users = df.user_id.unique().shape[0]
    n_items = df.item_id.unique().shape[0]

    print 'all users is :' + str(n_users) + ', all items is :' + str(n_items)

    #            
    train_data,test_data = cv.train_test_split(df,test_size = 0.25)

    train_data_matrix = np.zeros((n_users,n_items))
    for line in train_data.itertuples():
        train_data_matrix[line[1]-1, line[2]-1] = line[3]

    test_data_matrix = np.zeros((n_users,n_items))
    for line in test_data.itertuples():
        test_data_matrix[line[1]-1,line[2]-1] = line[3]

    #  user     item    ,     943*943,1682*1682
    user_similar = pairwise_distances(train_data_matrix, metric = "cosine")
    item_similar = pairwise_distances(train_data_matrix.T, metric = "cosine")

    return (train_data_matrix,test_data_matrix,user_similar,item_similar)

train_data_matrix,test_data_matrix,user_similar,item_similar = read_file()
print 'user_similar.shape is :',user_similar.shape
print 'item_similar.shape is :',item_similar.shape

def predict(rating, similar, type = 'user'):
    if type == 'user':
        mean_user_rating = rating.mean(axis = 1)
        rating_diff = (rating - mean_user_rating[:,np.newaxis])
        pred = mean_user_rating[:,np.newaxis] + similar.dot(rating_diff) / np.array([np.abs(similar).sum(axis=1)]).T
    elif type == 'item':
        pred = rating.dot(similar) / np.array([np.abs(similar).sum(axis=1)])

    return pred

user_prediction = predict(train_data_matrix, user_similar, type = 'user')
item_prediction = predict(train_data_matrix, item_similar, type = 'item')

def rmse(prediction,ground_truth):
    prediction = prediction[ground_truth.nonzero()].flatten()
    ground_truth = ground_truth[ground_truth.nonzero()].flatten()
    return sqrt(mean_squared_error(prediction, ground_truth))

print 'User based CF RMSE: ' + str(rmse(user_prediction, test_data_matrix))
print 'Item based CF RMSe: ' + str(rmse(item_prediction, test_data_matrix))

좋은 웹페이지 즐겨찾기