make_moons,使用dbscan算法对moons数据集聚类,改变ε和min_points n*n次,每次聚类结果在对应子图显示
时间: 2023-11-22 16:57:01 浏览: 134
好的,首先我们需要导入一些必要的库和生成数据集:
```python
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.cluster import DBSCAN
X, _ = make_moons(n_samples=500, noise=0.1, random_state=42)
plt.scatter(X[:,0], X[:,1], s=10)
plt.show()
```
![png](output_1_0.png)
接下来,我们定义一个函数 `plot_dbscan` 来进行聚类并绘制结果:
```python
def plot_dbscan(X, eps, min_samples, ax):
dbscan = DBSCAN(eps=eps, min_samples=min_samples)
clusters = dbscan.fit_predict(X)
n_clusters = len(set(clusters)) - (1 if -1 in clusters else 0)
colors = [plt.cm.Spectral(each)
for each in np.linspace(0, 1, n_clusters)]
for i, color in enumerate(colors):
if i == -1:
# 黑色为噪声点
color = [0, 0, 0, 1]
ax.scatter(X[clusters == i, 0], X[clusters == i, 1], s=10, c=color)
ax.set_title(f"eps={eps:.2f}, min_samples={min_samples}, clusters={n_clusters}")
```
现在我们可以开始绘制子图了:
```python
fig, axs = plt.subplots(4, 4, figsize=(16, 16))
eps_list = np.linspace(0.05, 0.5, 4)
min_samples_list = np.arange(5, 21, 4)
for i, eps in enumerate(eps_list):
for j, min_samples in enumerate(min_samples_list):
plot_dbscan(X, eps=eps, min_samples=min_samples, ax=axs[i][j])
plt.show()
```
![png](output_4_0.png)
在这个例子中,我们使用了 4x4 共 16 个子图来展示不同参数下的聚类结果。每个子图的标题显示了当前聚类的参数值和聚类数目。
可以看到,在 eps 和 min_samples 变化的过程中,聚类的结果也发生了变化。当 eps 增大或 min_samples 增大时,聚类数目会减少,而当这些参数减小时,聚类数目会增加。在这个例子中,我们可以看到,在 eps=0.15 和 min_samples=5 的情况下,聚类数目最多。
阅读全文