# -*- coding: utf-8 -*-
"""created on wed nov 28 18:50:57 2018
@author: muli
"""import numpy as np
from sklearn.datasets.samples_generator import make_blobs
from sklearn import cluster
from sklearn.metrics import adjusted_rand_score
import matplotlib.pyplot as plt
def create_data(centers,num=100,std=0.7):
'''生成用於聚類的資料集
:param centers: 聚類的中心點組成的陣列。如果中心點是二維的,則產生的每個樣本都是二維的。
:param num: 樣本數
:param std: 每個簇中樣本的標準差
:return: 用於聚類的資料集。是乙個元組,第乙個元素為樣本集,第二個元素為樣本集的真實簇分類標記
'''x, labels_true = make_blobs(n_samples=num, centers=centers, cluster_std=std)
return x,labels_true
def test_dbscan(*data):
'''測試 dbscan 的用法
:param data: 可變引數。
它是乙個元組。元組元素依次為:第乙個元素為樣本集,第二個元素為樣本集的真實簇分類標記
:return: none
'''x,labels_true=data
print(x)
print("*")
print(len(labels_true))
print("--------------------------")
clst=cluster.dbscan()
# 訓練模型並**每個樣本所屬的簇標記
predicted_labels=clst.fit_predict(x)
# ari 指數
print("ari:%s"% adjusted_rand_score(labels_true,predicted_labels))
# 核心樣本在原始訓練集中的位置
print(clst.core_sample_indices_)
print("--------------------------")
# 將原始資料集劃分為 len(x) 個 簇
print("core sample num:%d"%len(clst.core_sample_indices_))
def test_dbscan_epsilon(*data):
'''測試 dbscan 的聚類結果隨 eps 引數的影響
:param data: 可變引數。它是乙個元組。元組元素依次為:第乙個元素為樣本集,第二個元素為樣本集的真實簇分類標記
:return: none
'''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()
def test_dbscan_min_samples(*data):
'''測試 dbscan 的聚類結果隨 min_samples 引數的影響
:param data: 可變引數。它是乙個元組。元組元素依次為:第乙個元素為樣本集,第二個元素為樣本集的真實簇分類標記
:return: none
'''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='*')
ax.set_xlabel( "min_samples")
ax.set_ylabel('core_nums')
fig.suptitle("dbscan")
plt.show()
if __name__=='__main__':
centers=[[1,1],[2,2],[1,2],[10,20]] # 用於產生聚類的中心點
x,labels_true=create_data(centers,1000,0.5) # 產生用於聚類的資料集
# test_dbscan(x,labels_true) # 呼叫 test_dbscan 函式
# test_dbscan_epsilon(x,labels_true) # 呼叫 test_dbscan_epsilon 函式
test_dbscan_min_samples(x,labels_true) # 呼叫 test_dbscan_min_samples 函式
機器學習 密度聚類演算法 DBSCAN
1.密度聚類 基於密度的聚類演算法由於能夠發現任意形狀的聚類,識別資料集中的雜訊點,可伸縮性好等特點,在許多領域有著重要的應用。密度演算法概念 1 如果乙個資料點周圍足夠稠密,也就是以這個點為中心,給定半徑的鄰域內的資料點足夠多,密度大於密度閾值 使用者指定的引數minpts 則稱這個資料點為核心資...
機器學習 聚類系列 DBSCAN演算法
dbscan演算法 核心物件 若某個點的密度達到演算法設定的閾值則其為核心點。即 r 鄰域內點的數量不小於 minpts 鄰域的距離閾值 設定的半徑r 直接密度可達 若某點p在點q的 r 鄰域內,且q是核心點則p q直接密度可達。密度可達 若有乙個點的序列q0 q1 qk,對任意qi qi 1是直接...
機器學習 學習筆記 DBSCAN密度聚類
dbscan密度聚類演算法是一種基於密度的聚類演算法 dbscan密度聚類演算法將資料點分為三類 演算法過程 import numpy as np from sklearn.cluster import dbscandbscan主要引數 import numpy as np import sklea...