PCA-应用,简单的电影推荐

本文详细介绍如何使用PCA算法进行电影推荐系统的构建过程。首先通过下载数据集,并利用Pandas读取数据,接着创建用户-电影评分矩阵,对其进行标准化处理。之后计算协方差矩阵及其特征值与特征向量。最后通过PCA降维选出与目标电影最相似的十部电影。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇博客主要介绍PCA算法的应用

第一步:下载数据

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

第四步:标准化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)   

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值