首頁 > 軟體

詳解基於K-means的人物誌聚類模型

2022-05-17 16:01:19

一、概述

使用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()

到此這篇關於基於K-means的人物誌聚類模型的文章就介紹到這了,更多相關K-means人物誌聚類模型內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com