DBSAN密度聚类算法
生活随笔
收集整理的這篇文章主要介紹了
DBSAN密度聚类算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
import numpy as np
import matplotlib.pyplot as plt
import math
import randomfrom sklearn import datasets
# visitlist類用于記錄訪問列表
# unvisitedlist記錄未訪問過的點
# visitedlist記錄已訪問過的點
# unvisitednum記錄訪問過的點數量
class visitlist:def __init__(self, count=0):self.unvisitedlist=[i for i in range(count)]self.visitedlist=list()self.unvisitednum=countdef visit(self, pointId):self.visitedlist.append(pointId)self.unvisitedlist.remove(pointId)self.unvisitednum -= 1def dist(a, b):# 計算a,b兩個元組的歐幾里得距離return math.sqrt(np.power(a-b, 2).sum())def my_dbscanl(dataSet, eps, minPts):# numpy.ndarray的 shape屬性表示矩陣的行數與列數nPoints = dataSet.shape[0]print(nPoints)# (1)標記所有對象為unvisited# 在這里用一個類vPoints進行買現vPoints = visitlist(count=nPoints)# 初始化簇標記列表C,簇標記為 kk = -1C = [-1 for i in range(nPoints)]while(vPoints.unvisitednum > 0):# (3)隨機上選擇一個unvisited對象pp = random.choice(vPoints.unvisitedlist)# (4)標記p為visitedvPoints.visit(p)# (5)if p的$\varepsilon$-鄰域至少有MinPts個對象# N是p的$\varepsilon$-鄰域點列表N = [i for i in range(nPoints) if dist(dataSet[i], dataSet[p])<= eps]if len(N) >= minPts:# (6)創建個新簇C,并把p添加到C# 這里的C是一個標記列表,直接對第p個結點進行賦植k += 1C[p]=k# (7)令N為p的ε-鄰域中的對象的集合# N是p的$\varepsilon$-鄰域點集合# (8) for N中的每個點p'for p1 in N:# (9) if p'是unvisitedif p1 in vPoints.unvisitedlist:# (10)標記p’為visitedvPoints.visit(p1)# (11) if p'的$\varepsilon$-鄰域至少有MinPts個點,把這些點添加到N# 找出p'的$\varepsilon$-鄰域點,并將這些點去重添加到NM=[i for i in range(nPoints) if dist(dataSet[i], \dataSet[p1]) <= eps]if len(M) >= minPts:for i in M:if i not in N:N.append(i)# (12) if p'還不是任何簇的成員,把P'添加到C# C是標記列表,直接把p'分到對應的簇里即可if C[p1] == -1:C[p1]= k# (15)else標記p為噪聲else:C[p]=-1# (16)until沒有標t己為unvisitedl內對象return CX1, Y1 = datasets.make_circles(n_samples=2000, factor=0.6, noise=0.05,random_state=1)
X2, Y2 = datasets.make_blobs(n_samples=500, n_features=2, centers=[[1.5,1.5]],cluster_std=[[0.1]], random_state=5)
X = np.concatenate((X1, X2))
C1 = my_dbscanl(X, 0.1, 10)plt.scatter(X[:, 0], X[:, 1], c=C1, marker='.')
plt.show()
?
總結
以上是生活随笔為你收集整理的DBSAN密度聚类算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sql超低级用法(防遗忘)
- 下一篇: JAVA程序运行原理分析