# python实现 dbscan
# 参考:https://blog.csdn.net/FAICULTY/article/details/79430164
# 计算两个向量之间的欧氏距离
import random
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import make_blobs # 用于生成测试数据
# 计算两个向量之间的欧式距离
def calDist(X1, X2):
sum = 0
for x1, x2 in zip(X1, X2):
sum += (x1 - x2) ** 2
return sum ** 0.5
# 获取一个点的ε-邻域(记录的是索引)
def getNeibor(data, dataSet, e):
res = []
for i in range(np.shape(dataSet)[0]):
if calDist(data, dataSet[i]) < e:
res.append(i)
return res
# 密度聚类算法
def DBSCAN(dataSet, e, minPts):
coreObjs = {} # 初始化核心对象集合
C = {}
n = np.shape(dataSet)[0]
# 找出所有核心对象,key是核心对象的index,value是ε-邻域中对象的index
for i in range(n):
neibor = getNeibor(dataSet[i], dataSet, e)
if len(neibor) >= minPts:
coreObjs[i] = neibor
oldCoreObjs = coreObjs.copy()
k = 0 # 初始化聚类簇数
notAccess = list(range(n)) # 初始化未访问样本集合(索引)
while len(coreObjs) > 0:
OldNotAccess = []
OldNotAccess.extend(notAccess)
cores = coreObjs.keys()
# 随机选取一个核心对象
randNum = random.randint(0, len(cores) - 1)
cores = list(cores)
core = cores[randNum]
queue = []
queue.append(core)
notAccess.remove(core)
while len(queue) > 0:
q = queue[0]
del queue[0]
if q in oldCoreObjs.keys():
delte = [val for val in oldCoreObjs[q] if val in notAccess] # Δ = N(q)∩Γ
queue.extend(delte) # 将Δ中的样本加入队列Q
notAccess = [val for val in notAccess if val not in delte] # Γ = Γ\Δ
k += 1
C[k] = [val for val in OldNotAccess if val not in notAccess]
for x in C[k]:
if x in coreObjs.keys():
del coreObjs[x]
return C
def draw(C, dataSet):
color = ['r', 'y', 'g', 'b', 'c', 'k', 'm']
for i in C.keys():
X = []
Y = []
datas = C[i]
for j in range(len(datas)):
X.append(dataSet[datas[j]][0])
Y.append(dataSet[datas[j]][1])
plt.scatter(X, Y, marker='o', color=color[i % len(color)], label=i)
plt.legend(loc='upper right')
plt.show()
def loadDataSet():
X, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1, -1], [0, 0], [1, 1], [2, 2]],
cluster_std=[0.4, 0.2, 0.2, 0.2],
random_state=9)
data = X
return data
if __name__ == '__main__':
dataSet = loadDataSet()
print(dataSet)
C = DBSCAN(dataSet, 0.2, 5)
draw(C, dataSet)
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
聚类算法代码(MATLAB & python).zip (7个子文件)
聚类算法代码(MATLAB & python)
kmeans_matlab.m 2KB
kmeans_sklearn.py 929B
dbscan_matlab.m 4KB
dbscan_sklearn.py 1KB
kmeans_matlabFunc.m 977B
dbscan_python.py 3KB
kmeans_python.py 3KB
共 7 条
- 1
资源评论
- hioops2022-09-28资源和描述一致,质量不错,解决了我的问题,感谢资源主。
- 2201_758863742023-12-06资源质量不错,和资源描述一致,内容详细,对我很有用。
gis收藏家
- 粉丝: 1773
- 资源: 58
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功