欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解基于K-means的用戶畫像聚類模型

 更新時間:2022年05月17日 14:20:06   作者:拼命_小李  
這篇文章主要介紹了基于K-means的用戶畫像聚類模型,本文中就是使用one-hot思想將不同維度的數(shù)據(jù)利用字典映射的方式將其轉(zhuǎn)化為數(shù)據(jù)向量,需要的朋友可以參考下

一、概述

使用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)文章

最新評論