Python机器学习之协同过滤
17 Oct 2018 协同过滤指的是关联推荐的一种思路,而不是指的某种特定的算法。它的思路非常简单,首先我将具有相同特征的客户放到一个类中,例如客户A与B相似,然后将客户A所购买过的产品直接推荐给客户B,反之亦然。
本文抛砖引玉,主要实现一个基于用户的协同过滤模型,若有兴趣的同学,后续可以从以下几个方面进行延伸:
1.如何用相同的方法实现基于产品的协同过滤模型;
2.如何利用其他相似度计算方法(余弦距离、聚类等)改进协同过滤模型;
协同过滤需要两份数据,包括用户特征信息表UserandFeature和用户产品关联表UserandLabel
· 基于用户协同过滤python程序
import csv
import math
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
# ==== 1.数据预处理 ====
data = pd.read_csv('d:\\UserandFeature.csv',sep=',',encoding='gbk')
# fillna()是pandas函数,用于数据填充(向前填充)
data = data.fillna(method = 'ffill', axis = 1).values
# MinMaxScaler最大最小标准化公式:X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
scaler = MinMaxScaler(feature_range=(0,1))
dataset = scaler.fit_transform(data)
# DataFrame是pandas表格框架,目的是为了打出UserandFeature表格
# dataset1 = pd.DataFrame(dataset)
# dataset1.to_csv('d:\\UserandFeature1.csv', mode='w', header=False)
# ==== 2.相似度计算 ====
def Pearson(vec1, vec2):
vec1_ = vec1 - np.mean(vec1)
vec2_ = vec2 - np.mean(vec2)
sum = np.dot(vec1_, vec2_) / (np.linalg.norm(vec1_) * np.linalg.norm(vec2_))
return sum
# dataset.shape[0]表示array的行数
for i in range(dataset.shape[0]):
vec1 = dataset[i-1]
corr=[]
for j in range(dataset.shape[0]):
vec2 = dataset[j-1]
corr.append(Pearson(vec1, vec2))
# 将结果打印到SimilarityofUsers表中
with open('d:\\SimilarityofUsers.csv','a',newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(corr)
# ==== 3.基于用户的推荐 ====
similarity = pd.read_csv('d:\\SimilarityofUsers.csv').values
# 导入用户产品关联列表,第一列表示用户,第二列表示产品(无表头)
label = pd.read_csv('d:\\UserandLabel.csv').values.tolist()
# 读取相似度列表
for m in range(similarity.shape[0]):
a=[m+1]
for n in range(similarity.shape[0]):
if similarity[m,n] > 0.85:
a.append(label[n-1])
else:
continue
# 将结果打印到recommend表中
with open('d:\\recommend.csv','a',newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(a)
分类: 机器学习算法