用Sklearn實現聚類算法並用散點圖展現效果


一、背景

  好記性不如爛筆頭。記錄 一下項目上用到的算法與思路

二、問題描述

  近期收到一個項目,為A公司做數據整合,並開發出一套人物畫像系統與倆個算法模型,其中的一個模型就是做圖紙的分類。甲方(A公司)在最終會議前,給了點樣例數據,讓我們先做出個demo,給甲方的大老板們看一下

三、數據樣例

  甲方給的數據,包括:項目數據,人員數據,圖紙數據。以下的內容只用了圖紙數據,畢竟只是做圖紙的分類,用不到其他的樣本數據

  下面是圖紙的名稱示例:

          

 

 四、思路

  1.將圖紙名稱進行分詞,去除停用詞,添加自定義詞典,作為分析的特征

  2.計算每個特征的 Tf-Idf(詞頻-逆文檔頻率),作為特征的值

  3.選擇聚類算法,開始的時候我是首選Dbscan的,畢竟相比於Kmeans 來說,不需要事先知道要分幾類,調整領域和最小點數就可以完成分類,但是理論敗給現實,圖紙的名稱分詞的效果實在太接近,而且

  樣例數據本來就少,不足以區分開來,導致最后領域和最小點數的值無論怎么調效果都不盡人意,畢竟要給人家做demo,最后只好選了Kmeans。

五、代碼實現

  1.模型代碼

 1 # -*- coding:UTF-8 -*-
 2 import jieba
 3 import matplotlib.pyplot as plt
 4 import pandas  as pd
 5 from sklearn.cluster import KMeans
 6 from sklearn.feature_extraction.text import TfidfVectorizer
 7 from sklearn.manifold import TSNE
 8 
 9 data = open(r'xxx[文件路徑].csv', encoding="utf8")
10 data = pd.read_csv(data)
11 file_userdict = 'userdict.txt'
12 # 導入自定義詞典(不讓jieba把他們分開)
13 jieba.load_userdict(file_userdict)
14 # 停用詞列表
15 stop_words = ["-", "", "", ".", "pdf", "-"]
16 # tf-idf 詞頻-逆文檔頻率 tokenizer  意為分詞器 stop_words 停用詞
17 tf = TfidfVectorizer(tokenizer=jieba.lcut, stop_words=stop_words)
18 # tf-idf  計算
19 X = tf.fit_transform(data["圖紙名"])
20 # 將結果轉為numpy的數組
21 res_matrix = X.toarray()
22 # kmeans,目標定位2類
23 kmeans = KMeans(n_clusters=2)
24 kmeans.fit(X)

  2.結果可視化代碼

 1 # 預測結果的標簽列表
 2 labels = kmeans.labels_
 3 labels = pd.DataFrame(labels, columns=['labels'])
 4 res_matrix = pd.DataFrame(res_matrix)
 5 res_matrix.insert(res_matrix.shape[1], 'labels', labels)
 6 # tsne()將關系數據降為二維數據
 7 tsne = TSNE()
 8 a = tsne.fit_transform(res_matrix)
 9 liris = pd.DataFrame(a, index=res_matrix.index)
10 d1 = liris[res_matrix['labels'] == 0]
11 d2 = liris[res_matrix['labels'] == 1]
12 print(d1)
13 print(d2)
14 plt.plot(d1[0], d1[1], 'r.', d2[0], d2[1], 'go')
15 plt.show()

  3.分類效果展示

     

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM