Python机器学习之协同过滤

  协同过滤指的是关联推荐的一种思路,而不是指的某种特定的算法。它的思路非常简单,首先我将具有相同特征的客户放到一个类中,例如客户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)

分类: 机器学习算法