kmeans介紹學習博客:https://blog.csdn.net/sinat_30353259/article/details/80887779
kmeans代碼摘自:https://www.cnblogs.com/fengfenggirl/p/k-means.html
具體的學習介紹可以參考以上兩個博主博客
本文實現代碼也只是對以上博主博客的一個引用實現:
題目:讀數據庫,對文本進行聚類分析
代碼分析:(完整代碼在下方)
①確定k值
運行結果:
②由上圖可以確定一個k值,修改
運行結果:
說明:數據庫不便透露,數據格式如下txt文件:

農業 三農 農機 農資
生物醫葯中間體 生產工藝 低聚硒酸軟骨素
草皮
神經病理性疼痛 健康 養生
超聲心動圖 運動 心肌 健康
軟件
瀝青混凝土
殘余應力 無縫管
果醋飲料 釀造工藝 飲料
艾滋病 梅毒感染 梅毒 傳染病
養生 健康
復合材料
三農 農業 時政
火焰溫度 鍋爐
萬向軸
電源
時政
焦爐煤氣 凈化公司
魔芋 時政
污水
鋁合金 激光
科學 科普
防雷
畜牧業
棉花
時政
奶牛 三農 畜牧業
時政 於橋水庫
級配碎石
三農 畜牧業 池塘
草皮 土壤結構 三農 農業 種植業
環境污染
硫化工藝 乳膠
吸收系數
多糖
秸稈
環境污染 時政
葡萄
真空機組 真空系統
白靈菇 杏鮑菇
豆乳
時政
變壓器油
預應力 波紋管
地下空間
時政
鑽井液
鑽井液 環境保護
鑽井液
時政
鑽井液
時政
瀝青混凝土
丹參 中葯 三倍體
沼氣 水污染
三農 農業
健康
納米粒子 科學 科普
蔬菜
蔬菜
能源
蔬菜
蔬菜 潛葉蠅
蔬菜 三農
應用推廣 抽油機
聚丙烯酰胺 水污染 污水
三農 時政
營養學 營養餐
畜牧業
三農 畜牧業 海參 養殖技術
組態
時政
應用推廣
時政
羊肉營養 三農 肉羊 畜牧業
超濾膜 中空纖維超濾膜 微孔濾膜
通信 諧波 gprs
風機變頻器 關系邏輯
真空斷路器
畜牧業
煤氣 高爐煉鐵 高爐 煤炭
水污染 時政
造紙原料 環境保護 環境污染 時政 造紙術
酒精 發酵工藝 燃料
時政
蝴蝶蘭
三農 硅肥 畜牧業 飼料
蔬菜
肉牛
時政
肺癌 喉癌
葡萄 三農 時政
地質
施工工法 頂管 smw工法
鑽井液
韭菜
天然氣投資 能源 球罐
砂岩
時政 施工工藝
菜花 三農
完整代碼:
#!/usr/bin/env python # -*- coding: utf-8 -*- # @File : kmeans.py # @Author: 田智凱 # @Date : 2020/3/19 # @Desc :機器學習kmeans算法,對科技成果項目進行聚類分析 from __future__ import print_function import time from sklearn.feature_extraction.text import TfidfVectorizer import matplotlib.pyplot as plt from sklearn.cluster import KMeans, MiniBatchKMeans import pymssql #讀取sqlserver數據庫 def get_dbdata(): conn_read = pymssql.connect("127.0.0.1", "sa", "###", "test", charset="GBK") dataset = [] sql = "select guanjianci from julei_test" cursor = conn_read.cursor() cursor.execute(sql) data_count = 0 for line in cursor: data_count +=1 dataset.append(line[0]) cursor.close() conn_read.close() print(dataset) return dataset def transform(dataset, n_features=1000): vectorizer = TfidfVectorizer(max_df=0.5, max_features=n_features, min_df=2, use_idf=True) X = vectorizer.fit_transform(dataset) return X, vectorizer def train(X, vectorizer, true_k=10, minibatch=False, showLable=False): # 使用采樣數據還是原始數據訓練k-means, if minibatch: km = MiniBatchKMeans(n_clusters=true_k, init='k-means++', n_init=1, init_size=1000, batch_size=1000, verbose=False) else: km = KMeans(n_clusters=true_k, init='k-means++', max_iter=300, n_init=1, verbose=False) km.fit(X) if showLable: print("Top terms per cluster:") order_centroids = km.cluster_centers_.argsort()[:, ::-1] terms = vectorizer.get_feature_names() print(vectorizer.get_stop_words()) for i in range(true_k): print("Cluster %d:" % i, end='') for ind in order_centroids[i, :10]: print(' %s' % terms[ind], end='') print() result = list(km.predict(X)) print('Cluster distribution:') print(dict([(i, result.count(i)) for i in result])) return -km.score(X) #指定簇的個數k def k_determin(): '''測試選擇最優參數''' dataset = get_dbdata() print("%d documents" % len(dataset)) X, vectorizer = transform(dataset, n_features=500) true_ks = [] scores = [] #中心點的個數從3到200(根據自己的數據量改寫) for i in range(3, 200, 1): score = train(X, vectorizer, true_k=i) / len(dataset) print(i, score) true_ks.append(i) scores.append(score) plt.figure(figsize=(8, 4)) plt.plot(true_ks, scores, label="error", color="red", linewidth=1) plt.xlabel("n_features") plt.ylabel("error") plt.legend() plt.show() def main(): '''在最優參數下輸出聚類結果''' dataset = get_dbdata() X, vectorizer = transform(dataset, n_features=500) score = train(X, vectorizer, true_k=25, showLable=True) / len(dataset) print(score) if __name__ == '__main__': start=time.time() #k_determin()#先確定k值 main() end=time.time() print('程序運行時間',end-start)