聚類分析 一、概念 聚類分析是按照個(gè)體的特征將他們分類,讓同一個(gè)類別內(nèi)的個(gè)體之間具有較高的相似度,不同類別之間具有較大的差異性 聚類分析屬于無監(jiān)督學(xué)習(xí) 聚類對象可以分為Q型聚類和R型聚類 Q型聚類:樣本/記錄聚類 以距離為相似性指標(biāo) (歐氏距離、歐氏平方距離、馬氏距離、明式距離等) R型聚類:指標(biāo)/變量聚類以相似系數(shù)為相似性指標(biāo) (皮爾遜相關(guān)系數(shù)、夾角余弦、指數(shù)相關(guān)系數(shù)等) 二、常用的聚類算法
1、K-Means劃分法 K表示聚類算法中類的個(gè)數(shù),Means表示均值算法,K-Means即是用均值算法把數(shù)據(jù)分成K個(gè)類的算法。 K-Means算法的目標(biāo),是把n個(gè)樣本點(diǎn)劃分到k個(gè)類中,使得每個(gè)點(diǎn)都屬于離它最近的質(zhì)心(一個(gè)類內(nèi)部所有樣本點(diǎn)的均值)對應(yīng)的類,以之作為聚類的標(biāo)準(zhǔn)。 算法原理見 http://www./thread-18178-1-1.html【轉(zhuǎn)】 K-Means算法的計(jì)算步驟
基于sklearn包的實(shí)現(xiàn) 導(dǎo)入一份如下數(shù)據(jù),經(jīng)過各變量間的散點(diǎn)圖和相關(guān)系數(shù),發(fā)現(xiàn)工作日上班電話時(shí)長與總電話時(shí)長存在強(qiáng)正相關(guān)關(guān)系 選擇可建模的變量并降維 cloumns_fix1 = ['工作日上班時(shí)電話時(shí)長', '工作日下半時(shí)電話時(shí)長', '周末電話時(shí)長', '國際電話時(shí)長', '平均每次通話時(shí)長']#數(shù)據(jù)降維pca_2 = PCA(n_components=2)data_pca_2 = pd.DataFrame(pca_2.fit_transform(data[cloumns_fix1])) 通過sklearn包中的K-Means方法構(gòu)建模型
#預(yù)計(jì)將數(shù)據(jù)點(diǎn)分類為3類kmmodel = KMeans(n_clusters=3) #創(chuàng)建模型kmmodel = kmmodel.fit(data[cloumns_fix1]) #訓(xùn)練模型ptarget = kmmodel.predict(data[cloumns_fix1]) #對原始數(shù)據(jù)進(jìn)行標(biāo)注pd.crosstab(ptarget,ptarget) #交叉表查看各個(gè)類別數(shù)據(jù)的數(shù)量 plt.scatter(data_pca_2[0],data_pca_2[1],c=ptarget)#查看聚類的分布情況 最后,可以通過直方圖查看各聚類間的差異
2、 層次聚類法 層次聚類算法又稱為樹聚類算法,它根據(jù)數(shù)據(jù)之間的距離,透過一種層次架構(gòu)方式,反復(fù)將數(shù)據(jù)進(jìn)行聚合,創(chuàng)建一個(gè)層次以分解給定的數(shù)據(jù)集。層次聚類算法常用于一維數(shù)據(jù)的自動分組。 層次聚類算法是一種很直觀的聚類算法,基本思想是通過數(shù)據(jù)間的相似性,按相似性由高到低排序后重新連接各個(gè)節(jié)點(diǎn),整個(gè)過程就是建立一個(gè)樹結(jié)構(gòu),如下圖: 層次聚類算法的步驟:
基于sklearn包的實(shí)現(xiàn) 使用K-Means聚類案例中的數(shù)據(jù) cloumns_fix1 = ['工作日上班時(shí)電話時(shí)長', '工作日下半時(shí)電話時(shí)長', '周末電話時(shí)長', '國際電話時(shí)長', '平均每次通話時(shí)長']linkage = hcluster.linkage(data[cloumns_fix1], method='centroid') #中心點(diǎn)距離計(jì)算,得到矩陣 linkage = scipy.cluster.hierarchy.linkage(data, method='single') method 類距離計(jì)算公式有三種參數(shù):
#對聚類得到的類進(jìn)行標(biāo)注 層次聚類的結(jié)果,要聚類的個(gè)數(shù),劃分方法(maxclust,最大劃分法)ptarget = hcluster.fcluster(linkage, 3, criterion='maxclust')#查看各類別中樣本含量pd.crosstab(ptarget,ptarget) 繪制圖形 #使用主成分分析進(jìn)行數(shù)據(jù)降維pca_2 = PCA(n_components=2)data_pca_2 = pd.DataFrame(pca_2.fit_transform(data[cloumns_fix1]))plt.scatter(data_pca_2[0], data_pca_2[1], c=ptarget) #繪制圖形 3、 DBSCAN密度法 概念: 中文全稱:基于密度的帶噪聲的空間聚類應(yīng)用算法,它是將簇定義為密度相聯(lián)的點(diǎn)的最大集合,能夠把具有足夠高密度的區(qū)域劃分為簇,并可在噪聲的空間數(shù)據(jù)集中發(fā)現(xiàn)任意形狀的聚類。 密度:空間中任意一點(diǎn)的密度是以該點(diǎn)為圓心,以Eps為半徑的園區(qū)域內(nèi)包含的點(diǎn)數(shù)目。 鄰域:空間中任意一點(diǎn)的鄰域是以該店為圓心,以Eps為半徑的園區(qū)域內(nèi)包含的點(diǎn)集合。 核心點(diǎn):空間中某一點(diǎn)的密度,如果大于某一給定閾值MinPts,則稱該點(diǎn)為核心點(diǎn)。(小于MinPts則稱邊界點(diǎn)) 噪聲點(diǎn):既不是核心點(diǎn),也不是邊界點(diǎn)的任意點(diǎn) DBSCAN算法的步驟:
DBSCAN算法優(yōu)點(diǎn):
DBSCAN算法缺點(diǎn):
python中的實(shí)現(xiàn) 1)數(shù)學(xué)原理實(shí)現(xiàn) 導(dǎo)入一份如下分布的數(shù)據(jù)點(diǎn)的集合
將所有點(diǎn)進(jìn)行分類,得到核心點(diǎn)、邊界點(diǎn)和噪聲點(diǎn) #設(shè)置Eps和MinPtseps = 0.2MinPts = 5ptses = []for row in dist: #密度 density = np.sum(row<eps) pts = 0 if density>MinPts: #核心點(diǎn),密度大于5 pts = 1 elif density>1 : #邊界點(diǎn),密度大于1小于5 pts = 2 else: #噪聲點(diǎn),密度為1 pts = 0 ptses.append(pts)#得到每個(gè)點(diǎn)的分類 以防萬一,將噪聲點(diǎn)進(jìn)行過濾,并計(jì)算新的距離矩陣
以每個(gè)點(diǎn)為核心,得到該點(diǎn)的鄰域 cluster = dict()i = 0for row in coreDist: cluster[i] = numpy.where(row<eps)[0] i = i + 1 然后,將有交集的鄰域,都合并為新的領(lǐng)域
最后,找出獨(dú)立(也就是沒有交集)的鄰域,就是我們最后的聚類的結(jié)果了 result = dict()j = 0for i in range(len(cluster)): if len(cluster[i])>0: result[j] = cluster[i] j = j + 1#找出每個(gè)點(diǎn)所在領(lǐng)域的序號,作為他們最后聚類的結(jié)果標(biāo)記for i in range(len(result)): for j in result[i]: data.at[j, 'type'] = i plt.scatter(data['x'], data['y'], c=data['type']) 2)基于sklearn包的實(shí)現(xiàn)
end. 來源:博客園 |
|