选择两点举例说明
时间: 2025-05-29 16:27:49 浏览: 12
### 基于划分的聚类与基于密度聚类的区别举例
#### 示例一:圆形分布数据集
考虑一个二维平面上的数据点,它们形成了几个清晰的圆环状分布。在这种情况下:
- **基于划分的聚类(如 K-Means)** 将倾向于将这些数据点分配到以质心为中心的簇中,即使真实的簇形状是环形或其他非凸形状。由于 K-Means 使用欧几里得距离衡量相似性,并试图最小化簇内平方误差,因此它无法正确捕捉这种复杂的几何结构[^1]。
- **基于密度的聚类(如 DBSCAN)** 则可以通过设置适当的 `eps` 和 `MinPts` 参数成功识别出各个环形簇。这是因为 DBSCAN 关注的是局部密度而非全局中心,它可以连接高密度区域并将低密度区域视为分离部分或噪声[^4]。
---
#### 示例二:含噪点的数据集
假设有一个包含大量异常值(噪声点)的数据集,其中真实簇是由紧密聚集在一起的小型群体组成。
- **基于划分的聚类** 很难有效地处理这种情况,因为它会尝试将所有点都分配给某个簇,这可能导致错误分类或将噪声误认为正常成员的一部分。此外,如果初始化不当,可能会进一步恶化最终结果的质量[^2]。
- 相反,**基于密度的聚类** 提供了一种自然的方式来忽略那些远离任何密集区间的孤立点。例如,在执行 DBSCAN 时,只要适当调整参数,就可以把这些偏离主流趋势的单个观测标记为“噪声”,而不强制归属任何一个具体类别[^3]。
---
```python
import numpy as np
from sklearn.datasets import make_circles, make_blobs
from sklearn.cluster import KMeans, DBSCAN
import matplotlib.pyplot as plt
# Example with circular distribution
X_circle, _ = make_circles(n_samples=500, factor=.5, noise=.05)
km_circle = KMeans(n_clusters=2).fit(X_circle)
db_circle = DBSCAN(eps=0.2, min_samples=10).fit(X_circle)
fig, axes = plt.subplots(1, 2, figsize=(12, 6))
axes[0].scatter(X_circle[:, 0], X_circle[:, 1], c=km_circle.labels_)
axes[0].set_title("K-Means on Circular Data")
axes[1].scatter(X_circle[:, 0], X_circle[:, 1], c=db_circle.labels_)
axes[1].set_title("DBSCAN on Circular Data")
plt.show()
# Example with noisy data points
X_blob, y_blob = make_blobs(n_samples=300, centers=[[1, 1], [-1, -1]], cluster_std=0.4)
noise = np.random.uniform(-3, 3, (50, 2)) # Add some random noise
X_noisy = np.vstack([X_blob, noise])
km_noise = KMeans(n_clusters=2).fit(X_noisy)
db_noise = DBSCAN(eps=0.5, min_samples=10).fit(X_noisy)
fig, axes = plt.subplots(1, 2, figsize=(12, 6))
axes[0].scatter(X_noisy[:, 0], X_noisy[:, 1], c=km_noise.labels_)
axes[0].set_title("K-Means with Noise")
axes[1].scatter(X_noisy[:, 0], X_noisy[:, 1], c=db_noise.labels_)
axes[1].set_title("DBSCAN with Noise")
plt.show()
```
以上代码演示了两种典型场景下两类算法的行为差异。
---
阅读全文
相关推荐












