生活随笔
收集整理的這篇文章主要介紹了
DBSCAN算法理论和Python实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
- https://github.com/Sean16SYSU/MachineLearningImplement
DBSCAN算法
基于密度的聚類方法DBSCAN算法,是相當經典。
算法思路很簡單。
簡述算法思路:
選取密度較高的點作為核心點通過一個核心點出發,把其領域的點都放入到廣度優先搜索的隊列中。將所有找到的點歸結為一個類。之后,再從新的沒有被訪問過的點中找其他的核心點開始,又繼續進行廣度優先搜索。一直到所有的點都被訪問過(即分配過了對對應的類別)
Python實現
from sklearn
import datasets
import numpy
as np
import matplotlib
.pyplot
as pltiris
= datasets
.load_iris
()
def DBSCAN(X
, epsilon
=1, MinPts
=10):Nx
= [0 for i
in range(len(X
))] core_points
= []for i
, xi
in enumerate(X
):temp
= np
.array
([np
.linalg
.norm
(xi
- cj
) if i
!= j
else np
.inf
for j
, cj
in enumerate(X
)])Nx
[i
] = set(np
.where
(temp
< epsilon
)[0])if len(Nx
[i
]) >= MinPts
:core_points
.append
(i
)k
= 0not_visited
= set([i
for i
in range(len(X
))])Ck
= [0 for i
in range(len(X
))] if len(core_points
) == 0:print("Not core_points")while len(core_points
) > 0:not_visited_temp
= not_visitedo
= core_points
[np
.random
.randint
(0, len(core_points
))]Queue
= [o
]not_visited
= not_visited
- set(Queue
)while len(Queue
) > 0:q
= Queue
[0]Queue
= Queue
[1:]if len(Nx
[q
]) >= MinPts
:delta
= Nx
[q
] & not_visitedQueue
= Queue
+ list(delta
)not_visited
= not_visited
- deltaCk
[k
] = not_visited_temp
- not_visitedcore_points
= list(set(core_points
) - Ck
[k
])k
+= 1Ans
= np
.zeros
(len(X
))for k_i
in range(k
):Ans
[list(Ck
[k_i
])] = k_i
return Ans
test_y
= DBSCAN
(iris
.data
,)
from sklearn
.decomposition
import PCAX_reduced
= PCA
(n_components
=2).fit_transform
(iris
.data
)
plt
.scatter
(X_reduced
[:, 0], X_reduced
[:, 1], c
=test_y
, cmap
=plt
.cm
.Set1
)
- iris數據集其實是有三個類別的。應該是有些類別的數值數值波動特征不太明顯。
- 可以先做數據預處理之后,再做聚類,效果會好很多。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的DBSCAN算法理论和Python实现的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。