Python機(jī)器學(xué)習(xí)基礎(chǔ)-課件-第4章-無監(jiān)督學(xué)習(xí)_第1頁
Python機(jī)器學(xué)習(xí)基礎(chǔ)-課件-第4章-無監(jiān)督學(xué)習(xí)_第2頁
Python機(jī)器學(xué)習(xí)基礎(chǔ)-課件-第4章-無監(jiān)督學(xué)習(xí)_第3頁
Python機(jī)器學(xué)習(xí)基礎(chǔ)-課件-第4章-無監(jiān)督學(xué)習(xí)_第4頁
Python機(jī)器學(xué)習(xí)基礎(chǔ)-課件-第4章-無監(jiān)督學(xué)習(xí)_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第4章無監(jiān)督學(xué)習(xí)4.1K均值凝聚聚類4.2凝聚聚類4.3密度聚類之DBSCAN算法4.4小結(jié)4.1K均值凝聚聚類K均值凝聚聚類進(jìn)行入手,K均值凝聚聚類是聚類算法中最簡單的一個(gè),也是聚類算法中最實(shí)用的一個(gè),在平常運(yùn)用中使用次數(shù)也比較多。Kmeans算法,顧名思義,K表示類別數(shù),Means表示均值。Kmeans算法就是一種通過均值對(duì)數(shù)據(jù)進(jìn)行分類的算法。算法的原理很簡單,對(duì)于給定的數(shù)據(jù),按照數(shù)據(jù)之間的距離分為K個(gè)種類。讓種類間的距離相對(duì)比較小,而種類與種類之間的距離相對(duì)較遠(yuǎn),就是高內(nèi)聚低耦合。選擇K個(gè)算法的流程如下:首先先選擇K個(gè)聚類個(gè)數(shù).直接生成K個(gè)中心作為均值定量,或者隨機(jī)選擇K個(gè)均值定量,然后作為聚類中心。對(duì)每個(gè)點(diǎn)確定其聚類中心點(diǎn)。再計(jì)算其聚類新中心。重復(fù)以上步驟直到滿足收斂要求。(通常就是確定的中心點(diǎn)不再改變)。Kmeans的流程可以用以下一組圖表示。我們先設(shè)置了一個(gè)K值為三,然后我們先隨機(jī)從數(shù)據(jù)中找出三點(diǎn)作為三個(gè)均值定量,然后在計(jì)算所有數(shù)據(jù)各點(diǎn)到質(zhì)心的距離,然后將是數(shù)據(jù)分配給距離最近的一類,用不同的顏色表示數(shù)據(jù)所屬各類,然后經(jīng)過第一輪的迭代后從各類中可以計(jì)算新的均值定量,然后計(jì)算每個(gè)數(shù)據(jù)點(diǎn)到個(gè)類之間的最近距離分到該類里面,重復(fù)迭代上述步驟。最終得到了一個(gè)合適的均值定量來表示我們的類別。當(dāng)然在實(shí)際運(yùn)用該算法時(shí),一般會(huì)多以迭代,才能得到理想的結(jié)果。通過下列代碼觀察Kmeans算法的聚點(diǎn),并觀察決策邊界fromsklearn.datasetsimportmake_blobsimportmatplotlib.pyplotaspltblobs=make_blobs(random_state=7,centers=3)X_blobs=blobs[0]plt.scatter(X_blobs[:,0],X_blobs[:,1],c='r',edgecolors='k')fromsklearn.clusterimportKMeansimportnumpyasnpkmeans=KMeans(n_clusters=3)kmeans.fit(X_blobs)X_min,X_max=X_blobs[:,0].min()-0.5,X_blobs[:,0].max()+0.5y_min,y_max=X_blobs[:,1].min()-0.5,X_blobs[:,1].max()+0.5xx,yy=np.meshgrid(np.arange(X_min,X_max,.02),np.arange(y_min,y_max,.02))Z=kmeans.predict(np.c_[xx.ravel(),yy.ravel()])Z=Z.reshape(xx.shape)plt.figure(1)plt.clf()plt.imshow(Z,interpolation='nearest',extent=(xx.min(),xx.max(),yy.min(),yy.max()),cmap=plt.cm.summer,aspect='auto',origin='lower')plt.plot(X_blobs[:,0],X_blobs[:,1],'r.',markersize=5)centroids=kmeans.cluster_centers_plt.scatter(centroids[:,0],centroids[:,1],marker='x',s=150,linewidths=3,color='b',zorder=10)plt.xlim(X_min,X_max)plt.ylim(y_min,y_max)plt.xticks(())plt.yticks(())plt.show()看過此算法后,我們很容易與KNN算法搞混,兩者都有一個(gè)相似的過程,就是都需要找到某一個(gè)點(diǎn)最近的點(diǎn),二者都采用了最近鄰的思想。其實(shí)兩者的差別還是挺大的,Kmeans算法是無監(jiān)督學(xué)習(xí)的聚類算法,而KNN算法是監(jiān)督學(xué)習(xí)的分類算法。KNN算法基本不需要訓(xùn)練,只要從測試集里面根據(jù)距離計(jì)算公式找到K個(gè)點(diǎn),用這K個(gè)點(diǎn)表示測試機(jī)集的類別即可,而Kmeans算法有明顯的訓(xùn)練過程,需要反復(fù)迭代找到K個(gè)類別的最佳質(zhì)心來決定數(shù)據(jù)的類別。優(yōu)點(diǎn):1.原理簡單、實(shí)現(xiàn)容易,是解決聚類問題的一種經(jīng)典算法,保持可伸縮性和高效率,當(dāng)數(shù)據(jù)集是密集的,它的效果較好。2.算法的可解釋性較強(qiáng),只要需要調(diào)參的的參數(shù)只有分類數(shù)K。缺點(diǎn)1.必須事先給出K值,而且對(duì)初值敏感,對(duì)于不同的初始值,可能會(huì)導(dǎo)致不同結(jié)果。2.對(duì)躁聲和孤立點(diǎn)數(shù)據(jù)敏感。3.采用迭代方法,得到的結(jié)果只是局部最優(yōu)。4.2凝聚聚類

凝聚聚類算法類,是許多基于相同原則構(gòu)建的聚類算法,算法的原理如下:所謂凝聚聚類就是讓算法在一開始的時(shí)候,將每一個(gè)點(diǎn)作為一個(gè)類別,每一次進(jìn)行算法合并兩個(gè)最近的兩類,直到滿足某個(gè)條件為止。sklearn中實(shí)現(xiàn)該算法的滿足條件是類別的個(gè)數(shù),當(dāng)剩下指定個(gè)數(shù)的類時(shí),算法自動(dòng)停止。這里的參數(shù)重要的是鏈接準(zhǔn)則,他的意思是如何尋找最相近的點(diǎn)。sklearn庫中包含三種鏈接方式:ward:是默認(rèn)選項(xiàng),通過挑選兩個(gè)類來合并,類中的方差增加最小通過這中鏈接方式通常得到大小差不多相等的簇。average鏈接:將簇中所有點(diǎn)之間平均距離最小的兩個(gè)類合并。complete鏈接:也稱為最大鏈接,將簇中點(diǎn)之間最大距離最小的兩個(gè)類合并。ward適用于大多數(shù)數(shù)據(jù)集。如果類中的成員個(gè)數(shù)非常不同,那么average或complete可能效果更好。下面是對(duì)數(shù)據(jù)集采用三種鏈接準(zhǔn)則得到的結(jié)果。程序如下:

fromsklearn.datasets.samples_generatorimportmake_blobs

fromsklearn.clusterimportAgglomerativeClustering

importnumpyasnp

importmatplotlib.pyplotasplt

fromitertoolsimportcycle##python自帶的迭代器模塊

##產(chǎn)生隨機(jī)數(shù)據(jù)的中心

centers=[[1,1],[-1,-1],[1,-1]]

##產(chǎn)生的數(shù)據(jù)個(gè)數(shù)

X,lables_true=make_blobs(n_samples=2000,centers=centers,cluster_std=0.5,random_state=22)

ac=AgglomerativeClustering(linkage='ward',n_clusters=4)

##訓(xùn)練數(shù)據(jù)

ac.fit(X)

##每個(gè)數(shù)據(jù)的分類

lables=ac.labels_

##繪圖

plt.figure(1)

plt.clf()

colors=cycle('rgcy')

fork,colinzip(range(4),colors):

##根據(jù)lables中的值是否等于k,重新組成一個(gè)True、False的數(shù)組

my_members=lables==k

##X[my_members,0]取出my_members對(duì)應(yīng)位置為True的值的橫坐標(biāo)

plt.plot(X[my_members,0],X[my_members,1],col+'.')

plt.show()參數(shù)linkage的取值依次為:[‘ward’,‘a(chǎn)verage’,‘complete’]優(yōu)點(diǎn)

1、距離和規(guī)則的相似度容易定義,限制少

2、不需要預(yù)先制定聚類數(shù)

3、可以發(fā)現(xiàn)類的層次關(guān)系

缺點(diǎn)

1,計(jì)算復(fù)雜度太高

2,奇異值也能產(chǎn)生很大影響

3,算法很可能聚類成鏈狀4.3密度聚類之DBSCAN算法DBSCAN聚類算法是一種基于密度的算法,這一類算法通常通過根據(jù)數(shù)據(jù)的緊密程度進(jìn)行分類,如果一個(gè)數(shù)據(jù)屬于該類,則在其附近一定存在屬于該類的數(shù)據(jù)點(diǎn)。通過緊密分布的數(shù)據(jù)集分為一類,就得到了一個(gè)聚類類別。通過將所有數(shù)據(jù)劃分為不同類別,就得到了最終的聚類類別結(jié)果。該算法將具有足夠密度的區(qū)域劃分為一類,并在具有噪聲的數(shù)據(jù)集中能劃分出不同形狀的類別,它將類定義為密度相連的點(diǎn)的最大集合。那么它是怎么基于密度工作的呢?在一個(gè)數(shù)據(jù)集中,我們的目標(biāo)是把數(shù)據(jù)中密度相近的聚為一類。我們先從數(shù)據(jù)中選擇一點(diǎn),然后按照一定規(guī)則在這里尋找密度相近的點(diǎn)組成一類。其他的數(shù)據(jù)點(diǎn)也是如此。這個(gè)規(guī)則就是根據(jù)這個(gè)隨即被選中的數(shù)據(jù)點(diǎn)畫一個(gè)圓圈,規(guī)定這個(gè)圓的半徑以及圓內(nèi)最少包含的數(shù)據(jù)數(shù),然后在包含在內(nèi)的數(shù)據(jù)中轉(zhuǎn)移中心點(diǎn),那么這個(gè)圓圈的圓心就轉(zhuǎn)移到這個(gè)內(nèi)部樣本點(diǎn),繼續(xù)去圈附近其它的數(shù)據(jù)點(diǎn),然后一直重復(fù)上述過程,繼續(xù)增加數(shù)據(jù)點(diǎn)直到?jīng)]有符合條件的數(shù)據(jù)為止?;诿芏冗@點(diǎn)有什么好處呢,我們知道kmeans聚類算法只能根據(jù)距離進(jìn)行計(jì)算,而現(xiàn)實(shí)中還會(huì)有各種形狀的圖,比如環(huán)形圖,這個(gè)時(shí)候,kmeans算法就不適用。于是就想到根據(jù)數(shù)據(jù)的密度進(jìn)行分類。上述基本是DBSCAN算法的主要內(nèi)容了,是不是很簡單,但是我們還有三個(gè)問題沒有考慮。第一個(gè)是一些數(shù)據(jù)遠(yuǎn)離于其他數(shù)據(jù)點(diǎn),這些點(diǎn)不在任何一類的周圍,在DBSCAN中,我們一般將這些樣本點(diǎn)標(biāo)記為噪音點(diǎn)。第二個(gè)是距離的度量問題,即如何計(jì)算某樣本和核心對(duì)象樣本的距離。在DBSCAN中,一般采用最近鄰思想,采用某一種距離度量來衡量樣本距離,比如歐式距離。這和KNN分類算法的最近鄰思想完全相同。DBSCAN這個(gè)算法包括了重要的兩個(gè)參數(shù),這兩個(gè)參數(shù)比較難指定,公認(rèn)的指定方法是以下兩個(gè):

半徑:半徑是比較重要的一個(gè)點(diǎn),如果選擇過大了,圈住點(diǎn)就多了,類別的個(gè)數(shù)就少了,反之圈住的點(diǎn)少,類別就增加,這對(duì)最后生成的結(jié)果非常重要。

MinPts:這個(gè)參數(shù)就是圈住的點(diǎn)的個(gè)數(shù),也相當(dāng)于是一個(gè)密度,一般我們先讓這個(gè)值盡可能地小,然后進(jìn)行多次嘗試算法。下面我們對(duì)DBSCAN算法進(jìn)行應(yīng)用:首先我們生成一個(gè)環(huán)形數(shù)據(jù)來測試算法fromsklearn.datasets.samples_generatorimportmake_circlesimportmatplotlib.pyplotaspltfromsklearn.clusterimportDBSCANX,y_true=make_circles(n_samples=2000,factor=0.5,noise=0.1)#這是一個(gè)圓環(huán)形狀的#DBSCAN算法dbscan=DBSCAN(eps=.1,min_samples=10)dbscan.fit(X)#該算法對(duì)應(yīng)的兩個(gè)參數(shù)plt.scatter(X[:,0],X[:,1],c=dbscan.labels_)plt.show()從圖中可以看出,算法劃分的方法符合我們的思維,并且基本做到了完美劃分。接下來試驗(yàn)一下對(duì)于雙半月數(shù)據(jù),算法能不能做到好的預(yù)測

fromsklearn.datasetsimportmake_moons

importmatplotlib.pyplotasplt

fromsklearn.clusterimportDBSCAN

X,y_true=make_moons(n_samples=2000,noise=0.1)

#DBSCAN算法

dbscan=DBSCAN(eps=.1,min_samples=10)

dbscan.fit(X)#該算法對(duì)應(yīng)的兩個(gè)參數(shù)

plt.scatter(X[:,0],X[:,1],c=dbscan.labels_)

plt.show()從圖中看出,依舊能建立較好的模型。

測試完之后大家可能感覺沒有那么神奇,因?yàn)檫@種方法符合我們的思維,但是這是由計(jì)算機(jī)劃分出來的。與Kmeans算法進(jìn)行對(duì)比,我們就能知道這個(gè)算法的優(yōu)越之處了。fromsklearn.datasetsimportmake_moons

importmatplotlib.pyplotasplt

fromsklearn.clusterimportKMeans

X,y_true=make_moons(n_samples=2000,noise=0.1)

#DBSCAN算法

kmeans=KMeans(n_clusters=2)

kmeans.fit(X)#該算法對(duì)應(yīng)的兩個(gè)參數(shù)

plt.scatter(X[:,0],X[:,1],c=kmeans.labels_)

plt.show()可以看到如果分為兩類,這種劃分方式不符合我們的思維。所以對(duì)于不同的問題要選擇合適的算法才能解決。優(yōu)點(diǎn)1

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論