PCA-应用,简单的电影推荐
2018-03-27 19:50
218 查看
这篇博客主要介绍PCA算法的应用
第一步:下载数据
https://grouplens.org/datasets/movielens/下载ratings.dat (场次)和movies.dat.
第二步:pandas 读取数据
第三步:创建一个m*u 的rating 矩阵,m 是电影,u是用户。
第四步:标准化m*u 矩阵(减去均值,因为中心矩才能反应数据的离散的程度)normalized_mat
第五步:计算协方差矩阵和计算特征值和特征向量代码如下第六步:计算余弦相似度,排序并返回推荐10部电影的索引值。
第七步:从特征向量中选择前K个向量作为代表数据,movie_id 是推荐电影的索引值,top_n =10,是利用PCA选择出与其相似的十部电影。
其中,也可以使用SVD算法,U,S,V’=SVD(A)。SVD算法不用计算协方差矩阵(速度要比PCAS快),且A’*A等价于normlize_mat的协方差矩阵,V向量列值是normalized_mat 的主分量!代码如下:
# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
#读文件
data = pd.read_csv(r'C:\Users\Y\Desktop\Ml\ml-1m/ratings.dat',
names=['user_id', 'movie_id', 'rating', 'time'],
engine='python', delimiter='::')
movie_data = pd.read_csv(r'C:\Users\Y\Desktop\Ml\ml-1m/movies.dat',
names=['movie_id', 'title', 'genre'],
engine='python', delimiter='::')
# 创建一个m*u的数组
ratings_mat = np.ndarray(
shape=(np.max(data.movie_id.values), np.max(data.user_id.values)),
dtype=np.uint8)
ratings_mat[data.movie_id.values-1, data.user_id.values-1] = data.rating.values
#归一化计算特征向量
normalised_mat = ratings_mat - np.matrix(np.mean(ratings_mat, 1)).T
cov_mat = np.cov(normalised_mat)#
evals, evecs = np.linalg.eig(cov_mat)
def compute_cosine(data,movie_id,top_n=10):
index=movie_id-1
movie_row = data[index, :]
similarity = np.dot(movie_row, data.T)/(np.linalg.norm(movie_row)*np.linalg.norm(data.T))
sort_indexes = np.argsort(-similarity)
return sort_indexes[:top_n]
def print_movie(movie_data,movie_id,top_indexes):
print("推荐的电影是%s"%movie_data[movie_data.movie_id==movie_id].title.values[0])
print("与其相似的%g部电影:\n"%len(top_indexes))
for id in top_indexes+1:
print(movie_data[movie_data.movie_id == id].title.values[0])
k = 50
movie_id = 1 # Grab an id from movies.dat
top_n = 10
sliced = evecs[:, :k] # representative data
top_indexes = compute_cosine(sliced, movie_id, top_n)
print_movie(movie_data, movie_id, top_indexes)
第一步:下载数据
https://grouplens.org/datasets/movielens/下载ratings.dat (场次)和movies.dat.
第二步:pandas 读取数据
第三步:创建一个m*u 的rating 矩阵,m 是电影,u是用户。
| User1_id | User2_id |
Movie1_id | 2 | 0 |
Movie2_id | 2 | 1 |
Movie2_id | 0 | 2 |
第五步:计算协方差矩阵和计算特征值和特征向量代码如下第六步:计算余弦相似度,排序并返回推荐10部电影的索引值。
第七步:从特征向量中选择前K个向量作为代表数据,movie_id 是推荐电影的索引值,top_n =10,是利用PCA选择出与其相似的十部电影。
其中,也可以使用SVD算法,U,S,V’=SVD(A)。SVD算法不用计算协方差矩阵(速度要比PCAS快),且A’*A等价于normlize_mat的协方差矩阵,V向量列值是normalized_mat 的主分量!代码如下:
# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
#读文件
data = pd.read_csv(r'C:\Users\Y\Desktop\Ml\ml-1m/ratings.dat',
names=['user_id', 'movie_id', 'rating', 'time'],
engine='python', delimiter='::')
movie_data = pd.read_csv(r'C:\Users\Y\Desktop\Ml\ml-1m/movies.dat',
names=['movie_id', 'title', 'genre'],
engine='python', delimiter='::')
# 创建一个m*u的数组
ratings_mat = np.ndarray(
shape=(np.max(data.movie_id.values), np.max(data.user_id.values)),
dtype=np.uint8)
ratings_mat[data.movie_id.values-1, data.user_id.values-1] = data.rating.values
#归一化计算特征向量
normalised_mat = ratings_mat - np.matrix(np.mean(ratings_mat, 1)).T
cov_mat = np.cov(normalised_mat)#
evals, evecs = np.linalg.eig(cov_mat)
def compute_cosine(data,movie_id,top_n=10):
index=movie_id-1
movie_row = data[index, :]
similarity = np.dot(movie_row, data.T)/(np.linalg.norm(movie_row)*np.linalg.norm(data.T))
sort_indexes = np.argsort(-similarity)
return sort_indexes[:top_n]
def print_movie(movie_data,movie_id,top_indexes):
print("推荐的电影是%s"%movie_data[movie_data.movie_id==movie_id].title.values[0])
print("与其相似的%g部电影:\n"%len(top_indexes))
for id in top_indexes+1:
print(movie_data[movie_data.movie_id == id].title.values[0])
k = 50
movie_id = 1 # Grab an id from movies.dat
top_n = 10
sliced = evecs[:, :k] # representative data
top_indexes = compute_cosine(sliced, movie_id, top_n)
print_movie(movie_data, movie_id, top_indexes)
相关文章推荐
- RHEL5系列之三:GNOME桌面的简单管理和应用(4) 推荐
- squid proxy server简单应用 推荐
- 微服务应用-基于Spring Cloud和Docker构建电影推荐微服务
- 简单使用epel源来安装NTOP及使用和chkrootkit的安装应用 推荐
- 微服务应用-基于Spring Cloud和Docker构建电影推荐微服务
- 手把手实现linux下桌面应用.(QQ.飞信.股票.音乐.电影.游戏等) 推荐
- Ajax简单实例应用 推荐
- 菜鸟成长日记(四)之WMIC简单命令应用 推荐
- 奇异值分解SVD在简单推荐系统中的应用
- 推荐系统应用---电影类
- 微服务应用-基于Spring Cloud和Docker构建电影推荐微服务
- [机器学习笔记]奇异值分解SVD简介及其在推荐系统中的简单应用
- 【推荐系统】特征值分解(谱分解)和奇异值分解(SVD),即在PCA上的应用
- 电影推荐系统设计思路(简单易懂的算法理解)
- 简述LDA,PCA,SVD原理推导及其简单应用
- 理解梯度下降,随机梯度下降,附电影推荐系统的简单代码小样 1.
- RHEL5系列之三:GNOME桌面的简单管理和应用(2) 推荐
- 菜鸟成长日记(一)之WMIC简单命令应用 推荐
- 菜鸟成长日记(三)之WMIC简单命令应用 推荐
- android应用开发全程实录-用户界面部分章节-你真的会用最简单的TextView么? 推荐