使用Python编写DBSCAN聚类算法代码,要求输出类簇图片和所选定的核心点坐标集合
时间: 2024-05-09 18:19:01 浏览: 11
以下是使用Python编写的DBSCAN聚类算法代码,其中包括了输出类簇图片和所选定的核心点坐标集合的功能:
```python
import numpy as np
import matplotlib.pyplot as plt
# 计算两个点之间的欧几里得距离
def euclidean_distance(point1, point2):
return np.sqrt(np.sum(np.square(point1 - point2)))
# 找到以point为中心,半径为eps的邻域内的所有点
def find_neighbors(data, point, eps):
neighbors = []
for i in range(len(data)):
if euclidean_distance(data[i], point) < eps:
neighbors.append(i)
return neighbors
# 执行DBSCAN聚类算法
def dbscan(data, eps, min_samples):
# 初始化标记数组,标记每个点的聚类状态:未分类(-1)、噪音(0)或某个类簇(1, 2, ...)
labels = [-1] * len(data)
cluster = 0 # 记录当前类簇的编号
# 遍历每个点
for i in range(len(data)):
# 如果该点已经被分类过,则跳过
if labels[i] != -1:
continue
# 找到以该点为中心,半径为eps的邻域内的所有点
neighbors = find_neighbors(data, data[i], eps)
# 如果该点的邻域内的点的数量小于min_samples,则将该点标记为噪音点
if len(neighbors) < min_samples:
labels[i] = 0
# 否则,将该点及其邻域内的所有点标记为当前类簇
else:
cluster += 1
labels[i] = cluster
# 遍历该点邻域内的所有点
for j in neighbors:
# 如果该点还未被分类,则将其标记为当前类簇的成员
if labels[j] == -1:
labels[j] = cluster
# 如果该点已经被标记为噪音点,则将其重新标记为当前类簇的成员
elif labels[j] == 0:
labels[j] = cluster
# 找到该点的邻域内的所有点
neighbors_j = find_neighbors(data, data[j], eps)
# 如果该点的邻域内的点的数量不小于min_samples,则将其加入当前类簇
if len(neighbors_j) >= min_samples:
for k in neighbors_j:
if labels[k] == -1:
labels[k] = cluster
# 返回聚类结果
return labels
# 生成数据集
np.random.seed(0)
data = np.random.randn(200, 2)
# 执行DBSCAN聚类算法
labels = dbscan(data, eps=0.5, min_samples=5)
# 将聚类结果可视化
plt.figure()
colors = ['r', 'g', 'b', 'c', 'm', 'y', 'k']
for i in range(len(data)):
if labels[i] == -1:
plt.scatter(data[i, 0], data[i, 1], c='k', marker='.')
else:
plt.scatter(data[i, 0], data[i, 1], c=colors[labels[i]-1], marker='.')
plt.title('DBSCAN Clustering Result')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()
# 输出选定的核心点坐标集合
core_points = []
for i in range(len(data)):
if labels[i] != -1 and len(find_neighbors(data, data[i], eps=0.5)) >= 5:
core_points.append(data[i])
print('Core Points:', core_points)
```
该代码生成一个包含200个随机二维数据点的数据集,然后执行DBSCAN聚类算法,并将聚类结果可视化。最后,它输出了选定的核心点坐标集合。