详解基于K-means的用户画像聚类模型
作者:拼命_小李 发布时间:2021-11-15 20:49:52
一、概述
使用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)
数据处理
上面我们已经成功利用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 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()
来源:https://blog.csdn.net/m0_43432638/article/details/124778874


猜你喜欢
- 目前网络上有许多图片验证码形式,那些没有生成图片的验证码的抗破解防御能力简直不堪一击;有人直接在网页源码里显示出具体的数字,然后要求访问者输
- 以下的文章主要介绍的是MySQL 查询缓存的实际应用代码以及查看MySQL 查询缓存的大小 ,碎片整理,清除缓存以及监视MySQL 查询缓存
- 本文以实例形式分析了Python多进程编程技术,有助于进一步Python程序设计技巧。分享给大家供大家参考。具体分析如下:一般来说,由于Py
- 每一个变量都有数据类型,Go中的数据类型有:简单数据类型:int、float、complex、bool和string数据结构或组合(comp
- 1.安装Python-LDAP(python_ldap-2.4.25-cp27-none-win_amd64.whl)pip install
- 1.抽象类抽象类机制中总是要定义一个公共的基类,而将特定的细节留给继承者来实现。通过抽象概念,可以在开发项目中创建扩展性很好的架构。任何一个
- 目录selenium模块selenium基本概念基本使用基于浏览器自动化的操作selenium处理iframe:selenium模拟登陆QQ
- 一、 背景介绍web应用采用的是ssh框架,数据库使用的sql server2014版本。二、问题:客户要求,ID列的数据类型必须是uniq
- 有时候发微博时候,需要裁切图片为九宫格,但是ps或者其他工具都太麻烦,这里写一个python一键切割九宫格的工具,以供大家学习和使用!实现代
- 背景又很久没更新了,很幸运地新冠引发了严重的上呼吸道感染,大家羊过后注意休息和防护工作中(尤其是传统项目中)经常遇到这种需要,就是树形结构的
- 首先下载selenium模块,pip install selenium,下载一个浏览器驱动程序(我这里使用谷歌)。#导入#注意python各
- 一 开发环境集成开发工具:jupyter notebook 6.2.5集成开发环境:python 3.10.6第三方库:nump
- 本文实例讲述了php实现的美国50个州选择列表。分享给大家供大家参考。具体如下:这里展示的是php生成的美国50个州的选择列表,自动选择当前
- 在编写程序时,数据库结构会经常变化,所以经常需要编写一些数据库脚本,编写完成后需发往现场执行,如果已经存在或者重复执行,有些脚本会报错,所以
- XML 的使用越来越广泛,但是很多 XML 的结构并不好。即便结构良好,也常常设计得很糟,使得处理和维护非常困难。而大部分用于 XML 的基
- 本文将详细解释这些函数的使用方法。首先,我们介绍Python语言中类似于Windows系统的dir命令的列出文件功能,然后描述如何测试一个文
- 一.克隆表法一mysql> create table info1 like info;复制格式,通过LIKE方法,复制info表结构生
- 一、问题描述使用idea操作代码进行VCS很是方便,向github进行push和pull操作非常方便,但是,最近频繁提示需要重新输入用户名和
- 比如说在1-3000之内生成随机永不重复数,点击运行代码的时候请注意,此代码比较占用资源,如果硬件配置比较菜请把count改小。俺的电脑配置
- 理论Python中不存在真正的私有方法。为了实现类似于c++中私有方法,可以在类的方法或属性前加一个“_”单下划线,意味着该方法或属性不应该