描述k-means均值聚类算法的内容,k-means算法可以聚类哪种形状的样本
本文主要介绍了基于K-means的用户画像聚类模型。在本文中,one-hot的思想用于通过字典映射将不同维度的数据转换为数据向量。有需要的可以参考一下。
一.概述二。理论三。履行
目录
使用K-means对用户进行聚类的主要目的是实现用户画像的电影推荐系统。该建议由两部分组成。第一部分通过协同过滤实现电影推荐,第二部分通过静态属性构建用户画像实现电影推荐:用户的性别、年龄、地域、角色(学生、上班族、无业)、地域、婚姻状况。聚类(K-mens)算法用于进行人群评价。实现同一人群的电影推荐,其次是动态属性:通过记录用户行为数据,搜索记录使用word2vec模型推荐搜索关键词相似的电影。(稍后我会解释推荐的系统)
本文使用的语言是python3.6以上版本,使用的工具是jupyter-notebook,主要由python的sklearn、pandas、faker、matplotlib等库实现。
摘要:本文主要讲述的是第二部分使用K-means聚类构建用户画像模型从而实现相同用户喜爱电影的推荐.
一、概述
K-means是一种无监督聚类算法。其主要思想是随机选择K个对象作为初始聚类中心。然后计算每个对象到每个种子聚类中心的距离,从而找出相似的对象。
二、理论
数据采购
聚类前我们需要数据信息:包括姓名、年龄、性别、住址、工作类别、婚姻状况等。但是我们棘手的问题,数据从哪里来?目前获取数据的方式有两种:第一种是你可以通过网络爬虫技术抓取与信息相关的个人信息,第二种是python强大的库faker,可以帮助我们实现用户信息的自动模拟生成。如何使用faker可以参考我之前的博客~faker生成用户信息。
从faker进口Faker
进口熊猫作为pd
将numpy作为np导入
从集合导入订单直接
fake=Faker(locale=zh_CN )
Sex_dict=OrderedDict([(男性,0.52),(女性,0.48)])
Married_dict=OrderedDict([ ([(未婚,0.4),(已婚,0.5),(离异,0.1),])
Work_dict=OrderedDict([(在职,0.7),(自由职业,0.3),])
Type_dict=OrderedDict([(白领,0.45),(教师,0.1),(工人,0.2),(公务员,0.1),(销售,0.15)])
name=[]
年龄=[]
地址=[]
性别=[]
工作=[]
已婚=[]
type=[]
#生成的人数
数量=1000
#生成姓名年龄地址
对于范围(编号):内的I
name . append(false . name())
age.append(fake.random_int(最小值=16,最大值=45))
address.append(fake.province())
sex . append(fake . random _ element(sex _ dict))
work . append(fake . random _ element(work _ dict))
type . append(fake . random _ element(type _ dict))
married . append(fake . random _ element(married _ dict))
data={ 姓名 :姓名,年龄 :年龄,性别 :性别,地址 :地址,工作 :工作,已婚 :结婚,类型 :类型}
用户=pd。DataFrame.from_dict(数据)
数据处理
以上,我们已经利用faker库成功生成了用户信息,但是我们想一想,计算机算法是不可能理解中文的意思的,那么如何才能让kmeans模型知道这些数据的意思呢?我们需要对上面生成的数据进行矢量化。文本矢量化的方法有很多,比如one-hot、tfidf等。当然,不同的矢量化方法各有利弊,大家可以感兴趣。
去单独了解,此处不做详细解答。
本文中就是使用one-hot思想将不同维度的数据利用字典映射的方式将其转化为数据向量。
sex_map = {'男':0, '女':1}
married_map = {'未婚':0,'已婚':1,'离异':2}
work_map = {'在职':0, '自由职业':1}
type_map = {'白领':0,'教师':1,'工人':2,'公务员':3,'销售':4}
addr_map = {'上海市':0,'云南省':1,'内蒙古自治区':2,'北京市':3,'台湾省':4,'吉林省':5,'四川省':6,'天津市':7,'宁夏回族自治区':8
,'安徽省':9,'山东省':10,'山西省':11,'广东省':12,
'广西壮族自治区':13,'新疆维吾尔自治区':14,'江苏省':15,'江西省':16,'河北省':17,'河南省':18,'浙江省':19,'海南省':20,'湖北省':21,'湖南省':22,'澳门特别行政区':23,'甘肃省':24,
'福建省':25,'西藏自治区': 26,'贵州省':27,'辽宁省':28,'重庆市':29,'陕西省':30,'青海省':31,'香港特别行政区':32,'黑龙江省':33}
然后使用pandas中的map方法将每个维度数据按照上述字典类型进行向量化操作 ,转化后如下图所示:
users[married] = users[married].map(married_map)
模型实现
我们使用sklearn机器学习库创建kmeans模型,需要注意的是在使用kmeans分类前,向量做了一次数据标准化。
数据标准化的目的是通过对数据的每一个维度的值进行重新调节,使得最终的数据向量落在 [0,1]区间内,经过标准化处理后,原始数据转化为无量纲化指标测评值,各指标值处于同一数量级别,可进行综合测评分析。如果直接用原始指标值进行分析,就会突出数值较高的指标在综合分析中的作用,相对削弱数值水平较低指标的作用。
我将标准化步骤和kmeans模型做了一个连接所以都放到了一起,实现代码如下:
model = Pipeline([(BN,preprocessing.StandardScaler()),(KMS,KMeans())
])
model.fit(X)
# 保存模型
joblib.dump(model, "./model/model.pkl")
model = joblib.load("./model/model.pkl")
y_pred = model.predict(X)
# 将预测结果放入向量化的总数据里存储
users[lable] = y_pred
模型保存并测试
model = joblib.load("./model/model.pkl")y_pred = model.predict([X[0]])
y_pred
聚类结果可视化
使用adviz可视化原理是将一系列多维空间的点通过非线性方法映射到二维空间的可视化技术来实现可视化展示。
import matplotlib.pyplot as pltfrom pandas.plotting import radviz
"""
adviz可视化原理是将一系列多维空间的点通过非线性方法映射到二维空间的可视化技术,是基于圆形平行坐标系的设计思想而提出的多维可视化方法。圆形的m条半径表示m维空间,使用坐标系中的一点代表多为信息对象,其实现原理参照物理学中物体受力平衡定理。
mm维空间的点{Ai1,Ai2,...,AimAi1,Ai2,...,Aim}映射到二维可视空间的位置由弹簧引力分析模型确定。
首先将一个圆等分成 mm份,等分点的个数由数据维度决定,记各等分点为{R1,R2,...,RnR1,R2,...,Rn},每个等分点上固定一个弹簧,各个弹簧的弹性系数不同,弹簧 jj的弹性系数是AijAij,也就是第 jj维的值,所有mm个弹簧的另一端军固定在一个小圆上,如果这个小圆最终达到一个平衡位置 Bi={Xi,Yi}TBi={Xi,Yi}T,则弹力平衡点 {Xi,Yi}{Xi,Yi}就是m维空间点{ Ai1,Ai2,...,AimAi1,Ai2,...,Aim}在二维空间的投影点。
博客:https://blog.csdn.net/Haiyang_Duan/article/details/78985225
"""
plt.figure(用户画像聚类,figsize=(15, 7.5), dpi=80)
plt.title(radviz)
radviz(users.loc[:,age:], class_column=lable)
plt.show()
到此这篇关于基于K-means的用户画像聚类模型的文章就介绍到这了,更多相关K-means用户画像聚类模型内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。