推荐算法:
1.获取数据集
2.根据数据集,做数据分析,分析一定规律(相似度)
3.人为定义阈值k,根据分析结果,做筛选
4.筛选 正相关 匹配 的内容
5.筛选出推荐内容 进行排序 加权计算
权重:相似程度,偏好程度
第三方pandas模块:二维数据 dataframe数据集对象
1.创建数据集对象:
dataframe = pandas.DataFrames(
数据data = 二维数据
列columns = 序列
行(索引)index = 序列
)
2.使用dataframe对象:
dataframe.shape 数据集维度(n行m列)
dataframe.dtype 数据集数据类型
获取一行数据:
dataframe.loc[行名/索引名]
dataframe.iloc[n] 第n行数据
获取多行数据:
dataframe.loc[行名/索引名,行名/索引名....]
dataframe.iloc[n:m] 从第n行到m-1行数据
获取列数据
dataframe[列名,列名....]
排序:dataframe.sort_value(by=排序依据,ascending=True默认值为升序)
python中第三方模块matplotlib绘图
numpy中 皮尔逊相似函数 numpy.corrcoef()
不用pandas中dataframe数据集对象
直接numpy,做推荐?
基于内容推荐算法
##利用numpy生成二维数据 pandas数据分析
import numpy as np
import pandas as pd
##练习:依据上述 基于用户的推荐程序 设计一个 基于内容的推荐程序
##1.数据集 行=内容10 列=内容相关属性(要素)7 数据 二维数组
n = 20
m = 7
arr = np.random.randint(0,2,(n,m))
itemlist = ["item"+str(i) for i in range(n)]
attlist = ["att"+str(i) for i in range(m)]
data_df = pd.DataFrame(data=arr,columns=attlist,index=itemlist)
print(data_df)
##2.依据数据集 计算内容相似性 数据集
item_corr = data_df.T.corr(method="pearson")
print(item_corr)
##4.获取1个用户对 多个内容 偏好程度(1-3表示喜好程度 0表示没关系)
user_items_df = pd.DataFrame(data=np.random.randint(0,4,(1,n)),
columns=itemlist,index=["user"])
print(user_items_df)
##3.根据内容相似性 获取阈值的多个内容 筛选
##内容A 基于用户看过,相对比较喜欢的内容
##根据数据集 进行筛选 内容A
##itemA = "item0"
itemA = [key for key,value in user_items_df.loc["user"].items() if value > 2]
print(itemA)
k = 8
##根据itemA 序列 拿到 多行 item_corr 数据
itemA_corr = item_corr.loc[itemA]
print(itemA_corr)
##根据user_items_df 拿到 用户没看过的内容
user_missing_item = [key for key,value in user_items_df.loc["user"].items()
if value == 0]
print(user_missing_item)
##根据user_missing_item 和 itemA_corr 拿到 用户喜欢内容 和 用户没看过内容的 相似关系
itemA_missing_corr = itemA_corr[user_missing_item]
print(itemA_missing_corr)
'''
##遍历itemA
itemA_corr = []
for item in itemA:
itemA_corr.append(item_corr.loc[item].sort_values(ascending=False)[1:k+1])
##itemA_corr 序列list 【数据集一行(类对象),数据集一行(类对象)...】
##定义变量 得到所有 相似内容 和 相似度
itemA_corr_obj = {}
for item in itemA_corr:
##item 数据集一行(类对象) key:value 相似内容:相似程度
for key,value in item.items():
if value > 0: ##筛选出 正相关的相似内容
##判断 相似内容 在 itemA_corr_obj 里面是否存在
if key in itemA_corr_obj.keys():
itemA_corr_obj[key] += value
else:
itemA_corr_obj[key] = value
print(itemA_corr_obj)
##5.获取推荐给用户的内容
##用户没看过看过内容 相似内容 匹配
##根据 用户,内容,偏好 数据集 筛选 用户没看过内容
##python中转化函数enumerate(list/tuple) dir.items()
##将原序列转化新序列 新序列中每个元素(index/key,value)
user_missing_item = [key for key,value in user_items_df.loc["user"].items()
if value == 0]
print(user_missing_item)
##筛选 相似内容中 用户没看过
result = {key:value for key,value in itemA_corr_obj.items()
if key in user_missing_item}
##6.对推荐给用户的内容进行排序
result = sorted(result.items(),key = lambda x:x[1],reverse = True)
result = [item[0] for item in result]
print(result)
'''
基于用户推荐算法
##利用numpy生成二维数据 pandas数据分析
import numpy as np
import pandas as pd
##定义用户个数n 内容个数m
n = 8
m = 10
##python中random.randint随机生成整型[start,end]
##numpy中np.random.randint随机生成数值 整型[start,end) 偏好程度数据
arr = np.random.randint(0,2,(n,m))
##print(arr)
##定义两个列表,放user用户,内容item
userlist = ["user"+str(i) for i in range(n)]
itemlist = ["item"+str(i) for i in range(m)]
##print(itemlist)
##1.形成 用户 内容 偏好 数据集
data_df = pd.DataFrame(data=arr,columns=itemlist,index=userlist)
##data_df = pd.read_csv("cf_data.csv")
print(data_df)
##2.根据数据集 数据分析 利用皮尔逊相似函数 计算用户之间的相似性
user_corr = data_df.T.corr(method="pearson")
print(user_corr)
##3.根据用户之间相似性,获取推荐用户A的相似用户
##人为定义阈值k,前k个推荐用户A的相似用户
userA = "user1"
k = 3
##获取 数据集 中 userA 这行的数据
userA_corr = user_corr.loc[userA]
##进行降序排序
userA_corr = userA_corr.sort_values(ascending=False)
##获取 前k个值
userA_corr = userA_corr[1:k+1]
##对前k个值 进行筛选 用户之间 正相关
##同时获取list列表的索引和值 for index,item in enumerate(list)
##遍历序列 字典 获取每个 key:value 判断 value>0
##for key,value in userA_corr.items():
## if value > 0:
## print(key,value)
##序列推导式 list = [i for i in 原序列 if 条件判断]
userA_corr = {key:value for key,value in userA_corr.items() if value > 0}
print(userA_corr)
##4.获取推荐用户A 没看过的内容
##获取用户A 所有内容
userA_items = data_df.loc[userA]
##筛选出 没看过 值为0
userA_items = [ key for key,value in userA_items.items() if value == 0]
print(userA_items)
##5.获取相似用户 看过的内容 但是 用户A 没看过的 result
##获取用户相似用户 拿到userA_corr的key值
result = []
for key,value in userA_corr.items():
##获取相似用户 所有内容 筛选出 看过的 内容 值为1
##筛选 相似用户看过内容 不能重复 必须是用户A没看过的
result += [index for index,val in data_df.loc[key].items()
if val == 1 and index not in result and index in userA_items]
print(result)
##6.获取 要推荐给用户A的内容 result 推荐需不要顺序?要,加权计算
##推荐给用户A内容 多个item 看每个item 在相似用户中偏好程度 加权计算
##不同相似用户 权重不同 相似度就是相似用户的权重
##计算每一个item 权重=相似用户的权重*相似用户的喜好程度
res_sort = {}
for item in result:
##定义变量 item_qz 作为每个item的权重数
item_qz = 0
##遍历相似用户 获取 相似用户是谁?key 相似度有多少?vlaue
for key,value in userA_corr.items():
item_qz += value * data_df.loc[key][item]
res_sort[item] = item_qz
##字典中没有内置方法进行排序,利用python语言内置函数sorted()进行排序
##sorted(序列,排序的依据key,升降序reverse=False)
##字典.items() key,value
res_sort = sorted(res_sort.items(),key=lambda x:x[1],reverse=True)
res_sort = [item[0] for item in res_sort]
print(res_sort)



