聚類和EM演算法 密度聚類

2021-08-17 18:05:15 字數 3868 閱讀 9165

模型原型

class sklearn.cluster.dbscan(eps=0.5,min_samples=5,metric=』euclidean』,

algorithm=』auto』,leaf_size=30, p=none,random_state=none)

引數

- eps:ϵ引數,用於確定鄰域大小

- min_samples:minpts引數,用於判斷核心物件

- metric:用於計算距離

- algorithm:用於計算兩點間距離並找出最近鄰的點

- 『auto』:由演算法自動選取合適的演算法

- 『ball_tree』:用ball樹來搜尋

- 『kd_tree』:用kd樹來搜尋

- 『brute』:暴力搜尋

- leaf_size:當algorithm=ball_tree或者kd_tree時,樹的葉節點大小。該引數會影響構建樹、搜尋最近鄰的速度,同時影響記憶體樹的記憶體

- random_state

屬性

- core_sampleindices:核心樣本在原始訓練集中的位置

- components_:核心樣本的乙份副本

- labels_:每個樣本所屬的簇標記

方法

- fit(x[,y,sample_weight])

- fit_predict(x[,y,sample_weight])

import numpy as np

import matplotlib.pyplot as plt

from sklearn.datasets.samples_generator import make_blobs

from sklearn import cluster

from sklearn.metrics import adjusted_rand_score

from sklearn import mixture

產生資料

def

create_data

(centers,num=100,std=0.7):

x,labels_true=make_blobs(n_samples=num,centers=centers,cluster_std=std)

return x,labels_true

檢視生成的樣本點

def

plot_data

(*data):

x,labels_true=data

labels=np.unique(labels_true)

fig=plt.figure()

ax=fig.add_subplot(1,1,1)

colors='rgbyckm'

for i,label in enumerate(labels):

position=labels_true==label

ax.scatter(x[position,0],x[position,1],label='cluster %d'%label,color=colors[i%len(colors)])

ax.legend(loc='best',framealpha=0.5)

ax.set_xlabel('x[0]')

ax.set_ylabel('y[1]')

ax.set_title('data')

plt.show()

x,labels_true=create_data([[1,1],[2,2],[1,2],[10,20]],1000,0.5)

plot_data(x,labels_true)

使用dbscan

def

test_dbscan

(*data):

x,labels_true=data

clst=cluster.dbscan()

predicted_labels=clst.fit_predict(x)

print('ari:%s'%adjusted_rand_score(labels_true,predicted_labels))

print('core sample num:%d'%len(clst.core_sample_indices_))

centers=[[1,1],[2,2],[1,2],[10,20]]

x,labels_true=create_data(centers,1000,0.5)

test_dbscan(x,labels_true)

ϵ引數的影響

def

test_dbscan_epsilon

(*data):

x,labels_true=data

epsilons=np.logspace(-1,1.5)

aris=

core_nums=

for epsilon in epsilons:

clst=cluster.dbscan(eps=epsilon)

predicted_labels=clst.fit_predict(x)

fig=plt.figure()

ax=fig.add_subplot(1,2,1)

ax.plot(epsilons,aris,marker='+')

ax.set_xscale('log')

ax.set_xlabel(r'$\epsilon$')

ax.set_ylim(0,1)

ax.set_ylabel('ari')

ax=fig.add_subplot(1,2,2)

ax.plot(epsilons,core_nums,marker='o')

ax.set_xscale('log')

ax.set_xlabel(r'$\epsilon$')

ax.set_ylabel('core_nums')

fig.suptitle('dbscan')

plt.show()

test_dbscan_epsilon(x,labels_true)

minpts引數的影響

def

test_dbscan_min_samples

(*data):

x,labels_true=data

min_samples=range(1,100)

aris=

core_nums=

for num in min_samples:

clst=cluster.dbscan(min_samples=num)

predicted_labels=clst.fit_predict(x)

fig=plt.figure()

ax=fig.add_subplot(1,2,1)

ax.plot(min_samples,aris,marker='+')

ax.set_xlabel('min_samples')

ax.set_ylim(0,1)

ax.set_ylabel('ari')

ax=fig.add_subplot(1,2,2)

ax.plot(min_samples,core_nums,marker='o')

ax.set_xlabel('min_samples')

ax.set_ylabel('core_nums')

fig.suptitle('dbscan')

plt.show()

test_dbscan_min_samples(x,labels_true)

EM聚類演算法

em演算法也稱期望最大化 expectation maximum,簡稱em 演算法它是乙個基礎演算法,是很多機器學習領域演算法的基礎,比如隱式馬爾科夫演算法 hmm lda主題模型的變分推斷等等。em演算法解決這個的思路是使用啟發式的迭代方法,既然我們無法直接求出模型分布引數,那麼我們可以先猜想隱含...

機器學習 聚類 密度聚類演算法

一,介紹 密度聚類演算法有多種,我們這裡主要介紹一種著名的密度聚類演算法 dbscan。首先,我們通過下圖了解幾個概念 1 鄰域,與中心x距離不超過 距離,如上圖紅色虛線圈 2 核心物件,確定聚類的初始點,如上圖的x1 3 密度直達,在聚類核心物件鄰域內的點,如上圖x2由x1密度直達 4 密度可達,...

聚類總結(中) 密度聚類

密度聚類是一種基於密度的聚類方法,基於密度的聚類方法的主要思想是尋找被低密度區域分離的高密度區域。密度度量 乙個點的區域性密度有不同的度量方式 1.畫個圈,數圈內其他點個數是一種方法。2.用圈內其他點和給點半徑的比值的高斯概率密度形式,對距離核心點距離近的給大權重。3.計算圈內距離最小的前n個點到核...