聚类分析 - K-means - Python代码实现
算法簡介
K-means算法是很典型的基于距離的聚類算法,采用距離作為相似性的評價(jià)指標(biāo),即認(rèn)為兩個(gè)對象的距離越近,其相似度就越大。該算法認(rèn)為簇是由距離靠近的對象組成的,因此把得到緊湊且獨(dú)立的簇作為最終目標(biāo)。
算法過程如下:
1)從N個(gè)文檔隨機(jī)選取K個(gè)文檔作為中心點(diǎn);
2)對剩余的每個(gè)文檔測量其到每個(gè)中心點(diǎn)的距離,并把它歸到最近的質(zhì)心的類;
3)重新計(jì)算已經(jīng)得到的各個(gè)類的中心點(diǎn);
4)迭代2~3步直至新的質(zhì)心與原質(zhì)心相等或小于指定閾值,算法結(jié)束。
?
算法優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
缺點(diǎn):
代碼實(shí)現(xiàn)
第一步:讀取文件,簡單查看數(shù)據(jù)
import pandas as pd import numpy as np from pandas import DataFrame,Series from sklearn.cluster import KMeans from sklearn.cluster import Birch#讀取文件 datafile = u'E:\\pythondata\\julei.xlsx'#文件所在位置,u為防止路徑中有中文名稱,此處沒有,可以省略 outfile = u'E:\\pythondata\\julei_out.xlsx'#設(shè)置輸出文件的位置 data = pd.read_excel(datafile)#datafile是excel文件,所以用read_excel,如果是csv文件則用read_csv d = DataFrame(data) d.head()| 0.0888 | 201 | 36.02 | 28 | 0.5885 |
| 0.1399 | 198 | 39.32 | 30 | 0.8291 |
| 0.0747 | 198 | 38.80 | 26 | 0.4974 |
| 0.0983 | 191 | 40.71 | 30 | 0.5772 |
| 0.1276 | 196 | 38.40 | 28 | 0.5703 |
?列名:助攻,身高,比賽時(shí)間,年齡,得分,根據(jù)這幾項(xiàng)進(jìn)行聚類。
?
第二步:聚類
#聚類 mod = KMeans(n_clusters=3, n_jobs = 4, max_iter = 500)#聚成3類數(shù)據(jù),并發(fā)數(shù)為4,最大循環(huán)次數(shù)為500 mod.fit_predict(d)#y_pred表示聚類的結(jié)果#聚成3類數(shù)據(jù),統(tǒng)計(jì)每個(gè)聚類下的數(shù)據(jù)量,并且求出他們的中心 r1 = pd.Series(mod.labels_).value_counts() r2 = pd.DataFrame(mod.cluster_centers_) r = pd.concat([r2, r1], axis = 1) r.columns = list(d.columns) + [u'類別數(shù)目'] print(r)#給每一條數(shù)據(jù)標(biāo)注上被分為哪一類 r = pd.concat([d, pd.Series(mod.labels_, index = d.index)], axis = 1) r.columns = list(d.columns) + [u'聚類類別'] print(r.head()) r.to_excel(outfile)#如果需要保存到本地,就寫上這一列?
第三步:可視化,簡單的標(biāo)注上分為哪一類怎么能滿足?當(dāng)然要看看可視化效果,畢竟注意一目了然的判斷聚類的效果
#可視化過程 from sklearn.manifold import TSNEts = TSNE() ts.fit_transform(r) ts = pd.DataFrame(ts.embedding_, index = r.index)import matplotlib.pyplot as plta = ts[r[u'聚類類別'] == 0] plt.plot(a[0], a[1], 'r.') a = ts[r[u'聚類類別'] == 1] plt.plot(a[0], a[1], 'go') a = ts[r[u'聚類類別'] == 2] plt.plot(a[0], a[1], 'b*') plt.show()因?yàn)镵-means 算法過于大眾化,而且代碼其實(shí)比較簡單的,所以備注比較少,如果需要備注或者有任何疑問,歡迎留言。
總結(jié)
以上是生活随笔為你收集整理的聚类分析 - K-means - Python代码实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 特征计算 - Jaccard 相似系数与
- 下一篇: python 保存文件 吃内存_孤荷凌寒