脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - 详解基于K-means的用户画像聚类模型

详解基于K-means的用户画像聚类模型

2023-02-06 11:15拼命_小李 Python

这篇文章主要介绍了基于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生成用户信息

from faker import Faker
import pandas as pd
import numpy as np
from collections import OrderedDict
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 = []
age = []
address = []
sex = []
work = []
married = []
type = []
# 生成人数
num = 1000
# 生成name age address 
for i in range(num):
  name.append(fake.name())
  age.append(fake.random_int(min=16,max=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 = {'name':name,'age':age,'sex':sex,'address':address,'work':work,'married':married,'type':type}
users = pd.DataFrame.from_dict(data)

详解基于K-means的用户画像聚类模型

数据处理

上面我们已经成功利用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)

详解基于K-means的用户画像聚类模型

模型实现

我们使用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

详解基于K-means的用户画像聚类模型

模型保存并测试

model = joblib.load("./model/model.pkl")
y_pred = model.predict([X[0]])
y_pred

聚类结果可视化

使用adviz可视化原理是将一系列多维空间的点通过非线性方法映射到二维空间的可视化技术来实现可视化展示。

import matplotlib.pyplot as plt
from 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的用户画像聚类模型的文章就介绍到这了,更多相关K-means用户画像聚类模型内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/m0_43432638/article/details/124778874

延伸 · 阅读

精彩推荐
  • PythonPython实现贪心算法的示例

    Python实现贪心算法的示例

    这篇文章主要介绍了Python实现贪心算法的示例,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下...

    zjlwdqca8242021-09-30
  • Python详细过程带你用Python做车牌自动识别系统

    详细过程带你用Python做车牌自动识别系统

    这篇文章主要介绍了带你用Python做车牌自动识别系统的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友...

    Dragon少年4402021-12-25
  • Python如何在Python中用好短路机制

    如何在Python中用好短路机制

    这篇文章主要介绍了如何在Python中用好短路机制,Python中的短路机制非常有用,跟很多其他编程语言中的短路机制作用类似,接下来让我们通过几个简单的...

    费弗里7032022-10-07
  • PythonPython编程中的异常处理教程

    Python编程中的异常处理教程

    这篇文章主要介绍了Python编程中的异常处理教程,是Python入门学习中的基础知识,需要的朋友可以参考下...

    selFire3632020-07-30
  • Python给Python中的MySQLdb模块添加超时功能的教程

    给Python中的MySQLdb模块添加超时功能的教程

    这篇文章主要介绍了给Python中的MySQLdb模块添加超时功能的教程,timeout功能在服务器的运维当中非常有用,需要的朋友可以参考下 ...

    Python教程网4782020-06-22
  • Pythonpython远程连接MySQL数据库

    python远程连接MySQL数据库

    这篇文章主要为大家详细介绍了python远程连接MySQL数据库,拉取数据存至本地文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Eddy_zheng9182021-06-19
  • PythonPython实现emoji表情的简单方法

    Python实现emoji表情的简单方法

    “表情包”是一种利用图片来表示感情的一种方式。下面这篇文章主要给大家介绍了关于Python实现emoji表情的简单方法,需要的朋友可以参考下...

    ゛竹先森゜10392021-11-04
  • Python利用python求积分的实例

    利用python求积分的实例

    今天小编就为大家分享一篇利用python求积分的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    贪狼切10982021-07-30