Python機(jī)器學(xué)習(xí)之Kmeans基礎(chǔ)算法
一、K-means基礎(chǔ)算法簡(jiǎn)介
k-means算法是一種聚類(lèi)算法,所謂聚類(lèi),即根據(jù)相似性原則,將具有較高相似度的數(shù)據(jù)對(duì)象劃分至同一類(lèi)簇,將具有較高相異度的數(shù)據(jù)對(duì)象劃分至不同類(lèi)簇。聚類(lèi)與分類(lèi)最大的區(qū)別在于,聚類(lèi)過(guò)程為無(wú)監(jiān)督過(guò)程,即待處理數(shù)據(jù)對(duì)象沒(méi)有任何先驗(yàn)知識(shí),而分類(lèi)過(guò)程為有監(jiān)督過(guò)程,即存在有先驗(yàn)知識(shí)的訓(xùn)練數(shù)據(jù)集。
二、算法過(guò)程
K-means中心思想:事先確定常數(shù)K,常數(shù)K意味著最終的聚類(lèi)(或者叫簇)類(lèi)別數(shù),首先隨機(jī)選定初始點(diǎn)為質(zhì)心,并通過(guò)計(jì)算每一個(gè)樣本與質(zhì)心之間的相似度(這里為歐式距離),將樣本點(diǎn)歸到最相似的類(lèi)中,接著,重新計(jì)算每個(gè)類(lèi)的質(zhì)心(即為類(lèi)中心),重復(fù)這樣的過(guò)程,直到質(zhì)心不再改變,最終就確定了每個(gè)樣本所屬的類(lèi)別以及每個(gè)類(lèi)的質(zhì)心。由于每次都要計(jì)算所有的樣本與每一個(gè)質(zhì)心之間的相似度,故在大規(guī)模的數(shù)據(jù)集上,K-Means算法的收斂速度比較慢。
1.聚類(lèi)算法:
是一種典型的無(wú)監(jiān)督學(xué)習(xí)算法,主要用于將相似的樣本自動(dòng)歸到一個(gè)類(lèi)別中。
聚類(lèi)算法與分類(lèi)算法最大的區(qū)別是:聚類(lèi)算法是無(wú)監(jiān)督的學(xué)習(xí)算法,而分類(lèi)算法屬于監(jiān)督的學(xué)習(xí)
算法,分類(lèi)是知道結(jié)果的。
在聚類(lèi)算法中根據(jù)樣本之間的相似性,將樣本劃分到不同的類(lèi)別中,對(duì)于不同的相似度計(jì)算方法,會(huì)得到不同的聚類(lèi)結(jié)果,常用的相似度計(jì)算方法有歐式距離法。
2.聚類(lèi):
物理或抽象對(duì)象的集合分成由類(lèi)似的對(duì)象組成的多個(gè)類(lèi)的過(guò)程被稱(chēng)為聚類(lèi)。由聚類(lèi)所生成的簇是一組數(shù)據(jù)對(duì)象的集合,這些對(duì)象與同一個(gè)簇中的對(duì)象彼此相似,與其他簇中的對(duì)象相異。
3.簇:
本算法中可以理解為,把數(shù)據(jù)集聚類(lèi)成 k 類(lèi),即 k 個(gè)簇。
4.質(zhì)心:
指各個(gè)類(lèi)別的中心位置,即簇中心。
5.距離公式:
常用的有:歐幾里得距離(歐氏距離)、曼哈頓距離、閔可夫斯基距離等。
三、文字步驟
1.給定一個(gè)待處理的數(shù)據(jù)集
2.選擇簇的個(gè)數(shù)k(kmeans算法傳遞超參數(shù)的時(shí)候,只需設(shè)置最大的K值)
3.任意產(chǎn)生k個(gè)簇,生成K個(gè)簇的中心,記 K 個(gè)簇的中心分別為 c 1 , c 2 , . . . , c k c1,c2,...,ck c1,c2,...,ck;每個(gè)簇的樣本數(shù)量為 N 1 , N 2 , . . . , N 3 N1,N2,...,N3 N1,N2,...,N3。
4.通過(guò)歐幾里得距離公式計(jì)算各點(diǎn)到各質(zhì)心的距離,把每個(gè)點(diǎn)劃分給與其距離最近的質(zhì)心,從而初步把數(shù)據(jù)集分為了 K 類(lèi)點(diǎn)。
5.更新質(zhì)心:通過(guò)下面的公式來(lái)更新每個(gè)質(zhì)心。就是,新的質(zhì)心的值等于當(dāng)前該質(zhì)心所屬簇的所有點(diǎn)的平均值。 c j = 1 N j ∑ i = 1 N j x i , y i c_{j}=\frac{1}{N_{j}}\sum_{i=1}^{N{j}}x_{i},y_{i} cj=Nj1i=1∑Njxi,yi
6.重復(fù)以上步驟直到滿(mǎn)足收斂要求。(通常就是確定的中心點(diǎn)不再改變。)
四、圖形展示
按照上述步驟我們可以更好地理解分類(lèi)過(guò)程;
五、代碼實(shí)現(xiàn)
x 軸數(shù)據(jù)],[存儲(chǔ) y 軸數(shù)據(jù)]] for i in range(m): if i < m/3: data[0].append(uniform(1,5))#隨機(jī)設(shè)定 data[1].append(uniform(1,5)) elif i < 2*m/3: data[0].append(uniform(6,10)) data[1].append(uniform(1,5)) else: data[0].append(uniform(3,8)) data[1].append(uniform(5,10)) #將創(chuàng)建的數(shù)據(jù)集畫(huà)成散點(diǎn)圖 plt.scatter(data[0],data[1]) plt.xlim(0,11) plt.ylim(0,11) plt.show() #定義歐幾里得距離 def distEuclid(x1,y1,x2,y2): d = sqrt((x1-x2)**2+(y1-y2)**2) return d cent0 = [uniform(2,9),uniform(2,9)] #定義 K=3 個(gè)質(zhì)心,隨機(jī)賦值 cent1 = [uniform(2,9),uniform(2,9)] #[x,y] cent2 = [uniform(2,9),uniform(2,9)] mark = [] #標(biāo)記列表 dist = [[],[],[]]#各質(zhì)心到所有點(diǎn)的距離列表 #核心 for n in range(50): #計(jì)算各質(zhì)心到所有點(diǎn)的距離 for i in range(m): dist[0].append(distEuclid(cent0[0],cent0[1],data[0][i],data[1][i])) dist[1].append(distEuclid(cent1[0],cent1[1],data[0][i],data[1][i])) dist[2].append(distEuclid(cent2[0],cent2[1],data[0][i],data[1][i])) #對(duì)數(shù)據(jù)進(jìn)行整理 sum0_x = sum0_y = sum1_x = sum1_y = sum2_x = sum2_y = 0 number0 = number1 = number2 = 0 for i in range(m): if dist[0][i]<dist[1][i] and dist[0][i]<dist[2][i]: mark.append(0) sum0_x += data[0][i] sum0_y += data[1][i] number0 += 1 elif dist[1][i]<dist[0][i] and dist[1][i]<dist[2][i]: mark.append(1) sum1_x += data[0][i] sum1_y += data[1][i] number1 += 1 elif dist[2][i]<dist[0][i] and dist[2][i]<dist[1][i]: mark.append(2) sum2_x += data[0][i] sum2_y += data[1][i] number2 += 1 #更新質(zhì)心 cent0 = [sum0_x/number0,sum0_y/number0] cent1 = [sum1_x/number1,sum1_y/number1] cent2 = [sum2_x/number2,sum2_y/number2] #畫(huà)圖 for i in range(m): if mark[i] == 0: plt.scatter(data[0][i],data[1][i],color='red') if mark[i] == 1: plt.scatter(data[0][i],data[1][i],color='blue') if mark[i] == 2: plt.scatter(data[0][i],data[1][i],color='green') plt.scatter(cent0[0],cent0[1],marker='*',color='red') plt.scatter(cent1[0],cent1[1],marker='*',color='blue') plt.scatter(cent2[0],cent2[1],marker='*',color='green') plt.xlim(0,11) plt.ylim(0,11) plt.show() 在這里插入代碼片
上述代碼數(shù)據(jù)選擇是隨機(jī)生成的,每次運(yùn)行結(jié)果是不同的,測(cè)試會(huì)發(fā)現(xiàn)出現(xiàn)分類(lèi)不理想的效果。說(shuō)明基礎(chǔ)算法存在很大的弊端,我們需要改進(jìn),本篇內(nèi)容為基礎(chǔ)不做改進(jìn)知識(shí)的說(shuō)明。
- 幾種較好的分類(lèi)
- 幾種較差的分類(lèi)
六、小結(jié)
優(yōu)點(diǎn)
算法簡(jiǎn)單易實(shí)現(xiàn);
聚類(lèi)效果依賴(lài)K值選定,
缺點(diǎn)
需要用戶(hù)事先指定類(lèi)簇個(gè)數(shù);
聚類(lèi)結(jié)果對(duì)初始類(lèi)簇中心的選取較為敏感;
容易陷入局部最優(yōu); 只能發(fā)現(xiàn)球形類(lèi)簇;
到此這篇關(guān)于Python機(jī)器學(xué)習(xí)之Kmeans基礎(chǔ)算法的文章就介紹到這了,更多相關(guān)Python Kmeans基礎(chǔ)算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python3中正則模塊re.compile、re.match及re.search函數(shù)用法詳解
這篇文章主要介紹了Python3中正則模塊re.compile、re.match及re.search函數(shù)用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了re模塊 中re.compile、re.match及re.search函數(shù)的功能、參數(shù)、具體使用技巧與注意事項(xiàng),需要的朋友可以參考下2018-06-06python從入門(mén)到精通 windows安裝python圖文教程
這篇文章主要為大家詳細(xì)介紹了python從入門(mén)到精通,windows安裝python圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05在Python程序中實(shí)現(xiàn)分布式進(jìn)程的教程
這篇文章主要介紹了在Python程序中實(shí)現(xiàn)分布式進(jìn)程的教程,在多進(jìn)程編程中十分有用,示例代碼基于Python2.x版本,需要的朋友可以參考下2015-04-04關(guān)于Keras模型可視化教程及關(guān)鍵問(wèn)題的解決
今天小編就為大家分享一篇關(guān)于Keras模型可視化教程及關(guān)鍵問(wèn)題的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01Django使用mysqlclient服務(wù)連接并寫(xiě)入數(shù)據(jù)庫(kù)的操作過(guò)程
這篇文章主要介紹了Django使用mysqlclient服務(wù)連接并寫(xiě)入數(shù)據(jù)庫(kù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07在linux系統(tǒng)下安裝python librtmp包的實(shí)現(xiàn)方法
今天小編就為大家分享一篇在linux系統(tǒng)下安裝python librtmp包的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07通過(guò)python3實(shí)現(xiàn)投票功能代碼實(shí)例
這篇文章主要介紹了通過(guò)python3實(shí)現(xiàn)投票功能代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09Python實(shí)現(xiàn)網(wǎng)站表單提交和模板
今天小編就為大家分享一篇關(guān)于Python實(shí)現(xiàn)網(wǎng)站表單提交和模板,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01