国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python機器學習算法之k均值聚類(k-means)

2020-02-22 23:16:20
字體:
來源:轉載
供稿:網友

一開始的目的是學習十大挖掘算法(機器學習算法),并用編碼實現一遍,但越往后學習,越往后實現編碼,越發現自己的編碼水平低下,學習能力低。這一個k-means算法用Python實現竟用了三天時間,可見編碼水平之低,而且在編碼的過程中看了別人的編碼,才發現自己對numpy認識和運用的不足,在自己的代碼中有很多可以優化的地方,比如求均值的地方可以用mean直接對數組求均值,再比如去最小值的下標,我用的是argsort排序再取列表第一個,但是有argmin可以直接用啊。下面的代碼中這些可以優化的并沒有改,這么做的原因是希望做到拋磚引玉,歡迎大家丟玉,如果能給出優化方法就更好了

一.k-means算法

人以類聚,物以群分,k-means聚類算法就是體現。數學公式不要,直接用白話描述的步驟就是:

1.隨機選取k個質心(k值取決于你想聚成幾類)
2.計算樣本到質心的距離,距離質心距離近的歸為一類,分為k類
3.求出分類后的每類的新質心
4.判斷新舊質心是否相同,如果相同就代表已經聚類成功,如果沒有就循環2-3直到相同

用程序的語言描述就是:

1.輸入樣本
2.隨機去k個質心
3.重復下面過程知道算法收斂:

計算樣本到質心距離(歐幾里得距離)
樣本距離哪個質心近,就記為那一類
計算每個類別的新質心(平均值)

二.需求分析

數據來源:從國際統計局down的數據,數據為城鄉居民家庭人均收入及恩格爾系數(點擊這里下載)

數據描述:

1.橫軸:城鎮居民家庭人均可支配收入和農村居民家庭人均純收入,
2.縱軸:1996-2012年。
3.數據為年度數據

需求說明:我想把這數據做個聚類分析,看人民的收入大概經歷幾個階段(感覺我好高大上啊)

需求分析:

1.由于樣本數據有限,就兩列,用k-means聚類有很大的準確性
2.用文本的形式導入數據,結果輸出聚類后的質心,這樣就能看出人民的收入經歷了哪幾個階段

三.Python實現

引入numpy模塊,借用其中的一些方法進行數據處理,上代碼:

# -*- coding=utf-8 -*-"""authon:xuwfcreated:2017-02-07purpose:實現k-means算法"""import numpy as npimport random'''裝載數據'''def load(): data=np.loadtxt('data/k-means.csv',delimiter=',') return data'''計算距離'''def calcDis(data,clu,k): clalist=[] #存放計算距離后的list data=data.tolist() #轉化為列表 clu=clu.tolist() for i in range(len(data)):  clalist.append([])  for j in range(k):   dist=round(((data[i][1]-clu[j][0])**2+(data[i][2]-clu[j][1])**2)*0.05,1)   clalist[i].append(dist) clalist=np.array(clalist) #轉化為數組 return clalist'''分組'''def group(data,clalist,k): grouplist=[] #存放分組后的集群 claList=clalist.tolist() data=data.tolist() for i in range(k):  #確定要分組的個數,以空列表的形式,方便下面進行數據的插入  grouplist.append([]) for j in range(len(clalist)):  sortNum=np.argsort(clalist[j])  grouplist[sortNum[0]].append(data[j][1:]) grouplist=np.array(grouplist) return grouplist'''計算質心'''def calcCen(data,grouplist,k): clunew=[] data=data.tolist() grouplist=grouplist.tolist() templist=[] #templist=np.array(templist) for i in range(k):  #計算每個組的新質心  sumx=0  sumy=0  for j in range(len(grouplist[i])):   sumx+=grouplist[i][j][0]   sumy+=grouplist[i][j][1]  clunew.append([round(sumx/len(grouplist[i]),1),round(sumy/len(grouplist[i]),1)]) clunew=np.array(clunew) #clunew=np.mean(grouplist,axis=1) return clunew'''優化質心'''def classify(data,clu,k): clalist=calcDis(data,clu,k) #計算樣本到質心的距離 grouplist=group(data,clalist,k) #分組 for i in range(k):  #替換空值  if grouplist[i]==[]:   grouplist[i]=[4838.9,1926.1] clunew=calcCen(data,grouplist,k) sse=clunew-clu #print "the clu is :%r/nthe group is :%r/nthe clunew is :%r/nthe sse is :%r" %(clu,grouplist,clunew,sse) return sse,clunew,data,k if __name__=='__main__': k=3 #給出要分類的個數的k值 data=load() #裝載數據 clu=random.sample(data[:,1:].tolist(),k) #隨機取質心 clu=np.array(clu) sse,clunew,data,k=classify(data,clu,k) while np.any(sse!=0):  sse,clunew,data,k=classify(data,clunew,k) clunew=np.sort(clunew,axis=0) print "the best cluster is %r" %clunew            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 易门县| 休宁县| 碌曲县| 满城县| 屏山县| 汾西县| 阿荣旗| 凤阳县| 淳化县| 东城区| 平湖市| 尼勒克县| 北宁市| 微山县| 舞钢市| 牡丹江市| 雷波县| 林周县| 扬中市| 阜南县| 南和县| 比如县| 民县| 阿鲁科尔沁旗| 微山县| 甘德县| 迁安市| 陈巴尔虎旗| 赞皇县| 安仁县| 通江县| 扎囊县| 澄江县| 江津市| 红原县| 泰兴市| 武冈市| 淮南市| 综艺| 桑植县| 开鲁县|