模型原型
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個點到核...