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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第4章無監(jiān)督學習4.1K均值凝聚聚類4.2凝聚聚類4.3密度聚類之DBSCAN算法4.4小結4.1K均值凝聚聚類K均值凝聚聚類進行入手,K均值凝聚聚類是聚類算法中最簡單的一個,也是聚類算法中最實用的一個,在平常運用中使用次數(shù)也比較多。Kmeans算法,顧名思義,K表示類別數(shù),Means表示均值。Kmeans算法就是一種通過均值對數(shù)據(jù)進行分類的算法。算法的原理很簡單,對于給定的數(shù)據(jù),按照數(shù)據(jù)之間的距離分為K個種類。讓種類間的距離相對比較小,而種類與種類之間的距離相對較遠,就是高內聚低耦合。選擇K個算法的流程如下:首先先選擇K個聚類個數(shù).直接生成K個中心作為均值定量,或者隨機選擇K個均值定量,然后作為聚類中心。對每個點確定其聚類中心點。再計算其聚類新中心。重復以上步驟直到滿足收斂要求。(通常就是確定的中心點不再改變)。Kmeans的流程可以用以下一組圖表示。我們先設置了一個K值為三,然后我們先隨機從數(shù)據(jù)中找出三點作為三個均值定量,然后在計算所有數(shù)據(jù)各點到質心的距離,然后將是數(shù)據(jù)分配給距離最近的一類,用不同的顏色表示數(shù)據(jù)所屬各類,然后經過第一輪的迭代后從各類中可以計算新的均值定量,然后計算每個數(shù)據(jù)點到個類之間的最近距離分到該類里面,重復迭代上述步驟。最終得到了一個合適的均值定量來表示我們的類別。當然在實際運用該算法時,一般會多以迭代,才能得到理想的結果。通過下列代碼觀察Kmeans算法的聚點,并觀察決策邊界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算法搞混,兩者都有一個相似的過程,就是都需要找到某一個點最近的點,二者都采用了最近鄰的思想。其實兩者的差別還是挺大的,Kmeans算法是無監(jiān)督學習的聚類算法,而KNN算法是監(jiān)督學習的分類算法。KNN算法基本不需要訓練,只要從測試集里面根據(jù)距離計算公式找到K個點,用這K個點表示測試機集的類別即可,而Kmeans算法有明顯的訓練過程,需要反復迭代找到K個類別的最佳質心來決定數(shù)據(jù)的類別。優(yōu)點:1.原理簡單、實現(xiàn)容易,是解決聚類問題的一種經典算法,保持可伸縮性和高效率,當數(shù)據(jù)集是密集的,它的效果較好。2.算法的可解釋性較強,只要需要調參的的參數(shù)只有分類數(shù)K。缺點1.必須事先給出K值,而且對初值敏感,對于不同的初始值,可能會導致不同結果。2.對躁聲和孤立點數(shù)據(jù)敏感。3.采用迭代方法,得到的結果只是局部最優(yōu)。4.2凝聚聚類

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

fromsklearn.datasets.samples_generatorimportmake_blobs

fromsklearn.clusterimportAgglomerativeClustering

importnumpyasnp

importmatplotlib.pyplotasplt

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

##產生隨機數(shù)據(jù)的中心

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

##產生的數(shù)據(jù)個數(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)

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

ac.fit(X)

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

lables=ac.labels_

##繪圖

plt.figure(1)

plt.clf()

colors=cycle('rgcy')

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

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

my_members=lables==k

##X[my_members,0]取出my_members對應位置為True的值的橫坐標

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

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

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

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

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

缺點

1,計算復雜度太高

2,奇異值也能產生很大影響

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

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

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

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)#該算法對應的兩個參數(shù)

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

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

測試完之后大家可能感覺沒有那么神奇,因為這種方法符合我們的思維,但是這是由計算機劃分出來的。與Kmeans算法進行對比,我們就能知道這個算法的優(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)#該算法對應的兩個參數(shù)

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

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

溫馨提示

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

評論

0/150

提交評論