c++实现鸢尾花聚类算法dbscan代码
时间: 2023-05-17 22:00:32 浏览: 211
DBSCAN是一种基于密度的聚类算法,它能够将数据点分为不同的簇,同时能够识别噪声点。该算法的思想是:密度越大的区域,越应该被划分为一个簇;密度不足的区域,应该被视为噪声点或边界点。
以下是实现鸢尾花聚类算法DBSCAN的代码:
```python
import numpy as np
from sklearn import datasets
# 将数据集划分为核心点、边界点和噪声点
def classify_points(X, eps, min_pts):
"""
X: 数据集,numpy array类型
eps: 半径大小
min_pts: 最小的密度半径
"""
m = X.shape[0] # 数据集大小
# 初始化点的类型(未访问)
point_type = np.zeros(m, dtype=int)
# 计算邻域中每个点的距离
dist = np.zeros((m, m))
for i in range(m):
for j in range(m):
dist[i,j] = np.linalg.norm(X[i]-X[j])
# 密度半径
neigh_points = np.array([np.where(dist[i] < eps)[0] for i in range(m)])
neigh_counts = np.array([len(neigh_points[i]) for i in range(m)])
# 当前簇的标识
cluster_id = 1
# 标记核心点、边界点以及噪声点
for i in range(m):
if point_type[i] != 0:
continue
if neigh_counts[i] >= min_pts:
point_type[i] = cluster_id
# 若i是核心点,则将其邻域中的点也归为簇中
for j in neigh_points[i]:
if neigh_counts[j] >= min_pts:
point_type[j] = cluster_id
if point_type[j] == 0:
point_type[j] = -1 # 标记为边界点
else:
point_type[i] = -1 # 标记为噪声点
cluster_id += 1
return point_type
# DBSCAN算法主体
def dbscan(X, eps, min_pts):
point_type = classify_points(X, eps, min_pts)
n_clusters = max(point_type)
clusters = []
for i in range(1, n_clusters+1):
clusters.append(X[point_type == i])
return clusters
# 加载数据集
iris = datasets.load_iris()
X = iris["data"][:, :2]
# 聚类
clusters = dbscan(X, 0.5, 5)
# 绘制聚类结果
import matplotlib.pyplot as plt
colors = ['red', 'green', 'blue', 'purple', 'black']
labels = ['Cluster {}'.format(i+1) for i in range(len(clusters))]
for i, cluster in enumerate(clusters):
plt.scatter(cluster[:,0], cluster[:,1], c=colors[i], label=labels[i])
plt.legend()
plt.show()
```
在上述代码中,`classify_points`函数计算每个点的密度半径,并将其分类为核心点、边界点和噪声点。`dbscan`函数将得到的结果按照簇的数量返回。
最后,我们使用鸢尾花数据集的前两列特征,用半径为0.5、最小密度半径为5的DBSCAN算法进行聚类,并绘制结果图。
阅读全文