詳解基于K-means的用戶畫像聚類模型
一、概述
使用K-means進(jìn)行用戶聚類劃分主要的目的是實(shí)現(xiàn)用戶畫像的電影推薦系統(tǒng),該推薦包括兩部分,第一部分通過協(xié)同過濾實(shí)現(xiàn)電影推薦 ,第二部分,構(gòu)建用戶畫像實(shí)現(xiàn)電影推薦,實(shí)現(xiàn)通過靜態(tài)屬性實(shí)現(xiàn):用戶性別,年齡,地域,角色(學(xué)生、上班族、待業(yè))、地域、婚姻狀態(tài),使用聚類(K-mens)算法對人群進(jìn)行劃分,實(shí)現(xiàn)相同人群的電影推薦,其次動態(tài)屬性:通過記錄用戶行為數(shù)據(jù),搜索記錄使用word2vec模型實(shí)現(xiàn)相似搜索關(guān)鍵詞推薦影片。(推薦系統(tǒng)我后續(xù)會進(jìn)行講解)
文中使用語言為python3.6以上實(shí)現(xiàn),使用的工具是jupyter-notebook進(jìn)行開發(fā),主要利用python的sklearn、pandas、faker、matplotlib等庫實(shí)現(xiàn)。
摘要:本文主要講述的是第二部分使用K-means聚類構(gòu)建用戶畫像模型從而實(shí)現(xiàn)相同用戶喜愛電影的推薦。
二、理論
K-means是一種無監(jiān)督的聚類算法,主要思想就是先隨機(jī)選取K個對象作為初始的聚類中心。然后計算每個對象與各個種子聚類中心之間的距離,從而找出相似對象。
三、實(shí)現(xiàn)
數(shù)據(jù)獲取
我們聚類前需要數(shù)據(jù)信息:包括姓名、年齡、性別、地址、工作類別、婚姻狀態(tài)等等,但是我們棘手的問題,數(shù)據(jù)從哪里來呢,獲取數(shù)據(jù)有目前有兩種方式:第一種你可以通過網(wǎng)絡(luò)爬蟲技術(shù)去爬取信息相關(guān)個人信息,第二種python擁有強(qiáng)大的庫faker能夠幫助我們實(shí)現(xiàn)用戶信息自動模擬生成。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), ('自由職業(yè)', 0.3), ]) type_dict = OrderedDict([('白領(lǐng)', 0.45), ('教師', 0.1), ('工人', 0.2), ('公務(wù)員', 0.1), ('銷售', 0.15)]) name = [] age = [] address = [] sex = [] work = [] married = [] type = [] # 生成人數(shù) 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)
數(shù)據(jù)處理
上面我們已經(jīng)成功利用faker庫生成了用戶信息,但是我們想想,計算機(jī)算法是不可能明白中文含義的,那么如何讓kmeans模型知道這些數(shù)據(jù)的含義意義呢?我們需要將上述產(chǎn)生的數(shù)據(jù)進(jìn)行向量化操作,文本向量化有很多方法,例如:one-hot、tfidf等等,當(dāng)然不同的向量化方式有個自的優(yōu)劣,感興趣大家可以去單獨(dú)了解,此處不做詳細(xì)解答。
本文中就是使用one-hot思想將不同維度的數(shù)據(jù)利用字典映射的方式將其轉(zhuǎn)化為數(shù)據(jù)向量。
sex_map = {'男':0, '女':1}
married_map = {'未婚':0,'已婚':1,'離異':2}
work_map = {'在職':0, '自由職業(yè)':1}
type_map = {'白領(lǐng)':0,'教師':1,'工人':2,'公務(wù)員':3,'銷售':4}
addr_map = {'上海市':0,'云南省':1,'內(nèi)蒙古自治區(qū)':2,'北京市':3,'臺灣省':4,'吉林省':5,'四川省':6,'天津市':7,'寧夏回族自治區(qū)':8
,'安徽省':9,'山東省':10,'山西省':11,'廣東省':12,
'廣西壯族自治區(qū)':13,'新疆維吾爾自治區(qū)':14,'江蘇省':15,'江西省':16,'河北省':17,'河南省':18,'浙江省':19,'海南省':20,'湖北省':21,'湖南省':22,'澳門特別行政區(qū)':23,'甘肅省':24,
'福建省':25,'西藏自治區(qū)': 26,'貴州省':27,'遼寧省':28,'重慶市':29,'陜西省':30,'青海省':31,'香港特別行政區(qū)':32,'黑龍江省':33}
然后使用pandas中的map方法將每個維度數(shù)據(jù)按照上述字典類型進(jìn)行向量化操作 ,轉(zhuǎn)化后如下圖所示:
users['married'] = users['married'].map(married_map)
模型實(shí)現(xiàn)
我們使用sklearn機(jī)器學(xué)習(xí)庫創(chuàng)建kmeans模型,需要注意的是在使用kmeans分類前,向量做了一次數(shù)據(jù)標(biāo)準(zhǔn)化。
數(shù)據(jù)標(biāo)準(zhǔn)化的目的是通過對數(shù)據(jù)的每一個維度的值進(jìn)行重新調(diào)節(jié),使得最終的數(shù)據(jù)向量落在 [0,1]區(qū)間內(nèi),經(jīng)過標(biāo)準(zhǔn)化處理后,原始數(shù)據(jù)轉(zhuǎn)化為無量綱化指標(biāo)測評值,各指標(biāo)值處于同一數(shù)量級別,可進(jìn)行綜合測評分析。如果直接用原始指標(biāo)值進(jìn)行分析,就會突出數(shù)值較高的指標(biāo)在綜合分析中的作用,相對削弱數(shù)值水平較低指標(biāo)的作用。
我將標(biāo)準(zhǔn)化步驟和kmeans模型做了一個連接所以都放到了一起,實(shí)現(xiàn)代碼如下:
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) # 將預(yù)測結(jié)果放入向量化的總數(shù)據(jù)里存儲 users['lable'] = y_pred
模型保存并測試
model = joblib.load("./model/model.pkl") y_pred = model.predict([X[0]]) y_pred
聚類結(jié)果可視化
使用adviz可視化原理是將一系列多維空間的點(diǎn)通過非線性方法映射到二維空間的可視化技術(shù)來實(shí)現(xiàn)可視化展示。
import matplotlib.pyplot as plt from pandas.plotting import radviz """ adviz可視化原理是將一系列多維空間的點(diǎn)通過非線性方法映射到二維空間的可視化技術(shù),是基于圓形平行坐標(biāo)系的設(shè)計思想而提出的多維可視化方法。圓形的m條半徑表示m維空間,使用坐標(biāo)系中的一點(diǎn)代表多為信息對象,其實(shí)現(xiàn)原理參照物理學(xué)中物體受力平衡定理。 mm維空間的點(diǎn){Ai1,Ai2,...,AimAi1,Ai2,...,Aim}映射到二維可視空間的位置由彈簧引力分析模型確定。 首先將一個圓等分成 mm份,等分點(diǎn)的個數(shù)由數(shù)據(jù)維度決定,記各等分點(diǎn)為{R1,R2,...,RnR1,R2,...,Rn},每個等分點(diǎn)上固定一個彈簧,各個彈簧的彈性系數(shù)不同,彈簧 jj的彈性系數(shù)是AijAij,也就是第 jj維的值,所有mm個彈簧的另一端軍固定在一個小圓上,如果這個小圓最終達(dá)到一個平衡位置 Bi={Xi,Yi}TBi={Xi,Yi}T,則彈力平衡點(diǎn) {Xi,Yi}{Xi,Yi}就是m維空間點(diǎn){ Ai1,Ai2,...,AimAi1,Ai2,...,Aim}在二維空間的投影點(diǎn)。 博客: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()
到此這篇關(guān)于基于K-means的用戶畫像聚類模型的文章就介紹到這了,更多相關(guān)K-means用戶畫像聚類模型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pytorch常用函數(shù)定義及resnet模型修改實(shí)例
這篇文章主要為大家介紹了pytorch常用函數(shù)定義及resnet模型修改實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06解決python 執(zhí)行sql語句時所傳參數(shù)含有單引號的問題
這篇文章主要介紹了解決python 執(zhí)行sql語句時所傳參數(shù)含有單引號的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06Python基礎(chǔ)之函數(shù)用法實(shí)例詳解
這篇文章主要介紹了Python中函數(shù)用法,包括了函數(shù)的創(chuàng)建、定義、參數(shù)等,需要的朋友可以參考下2014-09-09python計算數(shù)字或者數(shù)組的階乘的實(shí)現(xiàn)
本文主要介紹了python計算數(shù)字或者數(shù)組的階乘,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08Pytorch 神經(jīng)網(wǎng)絡(luò)—自定義數(shù)據(jù)集上實(shí)現(xiàn)教程
今天小編就為大家分享一篇Pytorch 神經(jīng)網(wǎng)絡(luò)—自定義數(shù)據(jù)集上實(shí)現(xiàn)教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01