機器學習之DBSCAN聚類

2021-09-02 02:34:14 字數 3379 閱讀 3225

# -*- 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...