代码功能
生成数据:
使用 make_moons 方法生成一个非线性分布的二维数据集,模拟月亮形状的两个半环形分布,同时添加一定的噪声。
数据标准化:
使用 StandardScaler 对数据进行标准化处理,使不同特征的值具有相同的分布范围(零均值和单位方差),以提高 DBSCAN 的距离计算效果。
应用 DBSCAN:
使用 DBSCAN 算法对标准化后的数据进行聚类分析:
eps=0.2 定义两个点被视为“邻居”的最大距离。
min_samples=5 指定一个点需要至少有 5 个邻居才能被视为核心点。
算法将点划分为不同的簇或标记为噪声点。
可视化聚类结果:
使用 Matplotlib 将聚类结果以散点图形式展示:
每个簇以不同颜色表示。
噪声点用黑色标记。
输出聚类统计:
打印每个簇的编号及其包含的点数,同时统计噪声点的数量。
代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.cluster import DBSCAN
from sklearn.preprocessing import StandardScaler
# 1. 生成示例数据
X, y = make_moons(n_samples=300, noise=0.05, random_state=42)# 生成类似月亮形状的数据# 2. 数据标准化(DBSCAN 对距离敏感,建议先标准化)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)# 3. 应用 DBSCAN
dbscan = DBSCAN(eps=0.2, min_samples=5)# 设置超参数
labels = dbscan.fit_predict(X_scaled)# 4. 可视化结果# 获取每个簇的颜色
unique_labels =set(labels)
colors =[plt.cm.Spectral(each)for each in np.linspace(0,1,len(unique_labels))]# 绘制聚类结果
plt.figure(figsize=(8,6))for k, col inzip(unique_labels, colors):if k ==-1:# 噪声点标记为黑色
col =[0,0,0,1]
class_member_mask =(labels == k)
xy = X[class_member_mask]
plt.plot(xy[:,0], xy[:,1],'o', markerfacecolor=tuple(col), markeredgecolor='k', markersize=6)
plt.title("DBSCAN Clustering")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()# 5. 输出聚类结果for i in unique_labels:if i ==-1:print(f"Cluster: Noise (Label {i}) - Number of points: {(labels == i).sum()}")else:print(f"Cluster: {i} - Number of points: {(labels == i).sum()}")
版权归原作者 C7211BA 所有, 如有侵权,请联系我们删除。