import pandas as pd
import numpy as np
import math
import itertools
# 整体的推荐算法
class UserCF():
def __init__(self, df_fake, sub2_product):
self.frame = df_fake
self.product = sub2_product
# self.screened_product_path = r'D:\work\dataclinic\fake\df_product1046.csv' #读取预筛选后的产品集
# self._init_data()
# def _init_data(self):
# self.frame = pd.read_csv(self.frame_path)
# self.product = pd.read_csv(self.product_path,encoding='GB18030')
# #self.screened_product_path = pd.read_csv(self.product_path,encoding='GB18030')
def screen(self, need):
self.frame = self.frame[(self.frame['诉求'].isin([need]))]
def vec_purchase(self):
# 提取购买记录并拉直
g = self.frame['购买记录']
g2 = self.frame['购买记录2']
g3 = self.frame['购买记录3']
wxid = list(self.frame['wechatid'])
s = pd.Series(wxid, index=g)
s2 = pd.Series(wxid, index=g2)
s3 = pd.Series(wxid, index=g3)
pin = pd.concat([s, s2, s3], axis=0)
dict_pin = {'wechatid': pin.values, '购买记录': pin.index, }
df2 = pd.DataFrame(dict_pin)
# 拉直后的dataframe(wechat id :购买记录)
self.frame_p = df2[~(df2['购买记录'].isin([-1]))]
# print(self.frame_p)
# 计算肤质向量(T区油,U区油,敏感肌,痘痘肌)的余弦相似度
def cosine_skin(self, target_user_id, other_user_id):
# 数据预处理
target_skin = []
other_skin = []
cols = ['T区油', 'U区油', '敏感肌', '痘痘肌']
for col in cols:
target_skin.append((self.frame[self.frame['wechatid'] == target_user_id][col].values[0]) * 2 - 1)
for col in cols:
other_skin.append((self.frame[self.frame['wechatid'] == other_user_id][col].values[0]) * 2 - 1)
# 计算余弦相似度
nume = sum(np.multiply(np.array(target_skin), np.array(other_skin))) # 分子
deno = sum(np.array(target_skin) ** 2) * sum(np.array(other_skin) ** 2) # 分母
cosine = nume / math.sqrt(deno)
return cosine
# 计算购买记录余弦相似度
def cosine_purchase(self, target_user_id, other_user_id):
target_items = self.frame_p[self.frame_p['wechatid'] == target_user_id]['购买记录']
items = self.frame_p[self.frame_p['wechatid'] == other_user_id]['购买记录']
union_len = len(set(target_items) & set(items))
if union_len == 0:
return 0.0
product = len(target_items) * len(items)
cosine = union_len / math.sqrt(product)
return cosine
# 计算加权平均相似度并排序
def get_top_n_users(self, target_user_id, top_n):
# 提取所有其他用户
other_users_id = [i for i in set(self.frame_p['wechatid']) if i != target_user_id]
# 计算与所有其他用户的购买相似度
sim_purchase_list = [self.cosine_purchase(target_user_id, other_user_id) for other_user_id in other_users_id]
# 计算与所有其他用户的肤质相似度
sim_skin_list = [self.cosine_skin(target_user_id, other_user_id) for other_user_id in other_users_id]
# 加权平均(现在是各占50%)
sim_list = list((np.array(sim_purchase_list) + np.array(sim_skin_list)) / 2)
sim_list = sorted(zip(other_users_id, sim_list), key=lambda x: x[1], reverse=True)
return sim_list[:top_n]
# 提取候选产品表
def get_candidates_items(self, target_user_id):
target_user_item = set(self.frame_p[self.frame_p['wechatid'] == target_user_id]['购买记录'])
other_user_item = set(self.frame_p[self.frame_p['wechatid'] != target_user_id]['购买记录'])
candidates_item = other_user_item - target_user_item # 寻找候选推荐品标准:目标用户没有使用过的(必要性存疑)
candidates_item = list(candidates_item & set(self.product['ind'].values))
# 候选推荐品必须属于上一步预筛选出的项目(目前使用全产品表代替筛选后产品表)
return candidates_item
# 计算用户兴趣程度
def get_top_n_items(self, top_n_users, candidates_items, top_n):
top_n_user_data = [self.frame_p[self.frame_p['wechatid'] == k] for k, _ in top_n_users]
interest_list = []
for ind in candidates_items:
tmp = []
for user_data in top_n_user_data:
if ind in user_data['购买记录'].values:
tmp.append(1)
else:
tmp.append(0)
interest = sum([top_n_users[i][1] * tmp[i] for i in range(len(top_n_users))])
interest_list.append((ind, interest))
interest_list = sorted(interest_list, key=lambda x: x[1], reverse=True)
return interest_list[:top_n]
# 输入wxid,需求 默认推荐产品数为10件 输出有序推荐产品
##################################@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@############3
def calculate(self, target_user):
top_n = self.product.shape[0]
target_user_id = target_user.wxid
need = target_user.诉求
self.screen(need)
self.vec_purchase()
top_n_users = self.get_top_n_users(target_user_id, top_n)
candidates_items = self.get_candidates_items(target_user_id)
top_n_items = self.get_top_n_items(top_n_users, candidates_items, top_n)
# 重构数据格式 返回完整推荐产品信息
productlist = [top_n_items[i][0] for i in range(len(top_n_items))]
product_rec = self.product[(self.product['ind'].isin(productlist))]
product_rec['InterestRate'] = [top_n_items[i][1] for i in range(len(top_n_items))]
return product_rec
# 组合的推荐算法
class CombRating():
def __init__(self,user, pro_withrate, fformula):
self.user = user
self.product = pro_withrate
self.fformula=fformula
# 第一个for 找到用户的诉求是哪一种 四个属性全部对上才行
# 第二个for 找到组合中应当有的产品类型,水 乳 霜 祛痘凝胶 洁面
def find_kind(self):
#print(self.fformula)
n_formula = self.fformula.shape[0]
for i in range(n_formula):
if (self.user.诉求 == self.fformula.诉求[i]) \
and (self.user.T区油 == self.fformula.T区油[i]) \
and (self.user.U区油 == self.fformula.U区油[i]) \
and (self.user.敏感肌 == self.fformula.敏感肌[i]):
i_formula = i
break
# 此处利用总共的产品种类解决数字的问题 但是我觉得数据形式变化才能根本解决问题 毕竟在一个表里面 不好分割两边
# 寻找第一个是产品类型的列 并记录此前经过的列数
form_list = []
total_pro_type = ['水', '乳', '霜', '祛痘凝胶', '洁面']
type_number = 0
for j in range(len(self.fformula.columns)):
if self.fformula.columns[j] in total_pro_type:
break
else:
type_number = type_number + 1
# 再找到所有需要的产品种类
for j in range(type_number, len(self.fformula.columns)):
if (self.fformula.loc[i_formula][j] == 1):
form_list.append(self.fformula.columns[j])
return form_list
def outer_multiple(self, form_list):
ddict={}
for i in range(len(form_list)):
ddict[form_list[i]] = list(self.product[self.product.剂型 == form_list[i]].ind)
# print(ddict)
dd = []
for i in itertools.product(*ddict.values()):
dd.append(i)
comb_pd = pd.DataFrame(dd)
# 为DF的每一列添加名称
column_name = []
for i in range(len(comb_pd.columns)):
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
1.本项目结合了Pandas数据处理工具和机器学习技术,旨在构建一个智能的护肤品推荐系统。该系统不仅会考虑用户的肤质特征,还会考虑过敏反应等因素,并筛选出相互禁忌的产品,以便为不确定如何选择护肤品的用户提供个性化的推荐。 2.项目运行环境:包括 Python 环境和Pycharm环境。 3.项目包括4个模块:文件读入、推荐算法、应用模块和测试调用函数。其中文件读入部分主要是读取用户的肤质特征、诉求以及过敏成分,同时导入5个数据集文件,分别是用户数据集、产品主要成分表、功能表、禁忌搭配成分表、护肤公式;推荐算法中的相似度由用户购买记录和肤质相似度组成,最后加权求和;应用模块可以根据已经计算并排序的用户,找到产品并加工好合适的数据格式,按照护肤公式中的种类进行排列组合,同时考虑单品过敏和组合推荐的相互禁忌情况。若有相互禁忌和过敏情况在最后输出让用户知情。 4.项目博客:https://blog.csdn.net/qq_31136513/article/details/132872128
资源推荐
资源详情
资源评论
收起资源包目录
基于Pandas+余弦相似度+大数据智能护肤品推荐系统——机器学习算法应用(含Python工程源码)+数据集.rar (8个子文件)
项目18 护肤品推荐系统报告
数据集
df_fake.csv 19KB
df_component.csv 82KB
Formula_formatting.csv 310B
ingredient_banned_to_number.xlsx 8KB
df_product1046.csv 8KB
Class_Recommend.py 16KB
推荐结果
组合推荐.csv 472B
单品推荐.csv 3KB
共 8 条
- 1
资源评论
小胡说人工智能
- 粉丝: 1w+
- 资源: 51
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功