代码实现:读入 PCA 降维后的二维鸢尾花数据集,按 DBSCAN 算法描述的过程完成数据集的聚类处理(设 eps=0.5,min_samples=5)(注意:不得直接调用 sklearn 或其他库中的 Kmeans 或类似函数),并输出聚类结果(簇总数,各样本的所属簇编号),调用 matplotlib 的 scatter 函数将聚类后各样本可视化输出(不同簇内的样本用不同的颜色表示,调用 sklearn 库中函数,计算得到外部指标(RI、FMI)和内部指标
时间: 2024-03-17 19:41:12 浏览: 107
好的,以下是按照 DBSCAN 算法描述进行实现的代码:
```python
import numpy as np
import pandas as pd
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
# 加载数据集
iris = pd.read_csv('iris.csv')
X = iris.iloc[:, :-1]
y = iris.iloc[:, -1]
# PCA降维
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
# DBSCAN聚类
def dbscan(X, eps=0.5, min_samples=5):
m, n = X.shape
visited = np.zeros(m, dtype=bool)
labels = np.zeros(m, dtype=int)
cluster_id = 1
for i in range(m):
if not visited[i]:
visited[i] = True
neighbors = get_neighbors(X, i, eps)
if len(neighbors) < min_samples:
labels[i] = -1
else:
expand_cluster(X, i, neighbors, visited, labels, cluster_id, eps, min_samples)
cluster_id += 1
return labels
def get_neighbors(X, i, eps):
dists = np.sum((X - X[i]) ** 2, axis=1)
neighbors = np.where(dists < eps ** 2)[0]
return neighbors
def expand_cluster(X, i, neighbors, visited, labels, cluster_id, eps, min_samples):
labels[i] = cluster_id
for j in neighbors:
if not visited[j]:
visited[j] = True
new_neighbors = get_neighbors(X, j, eps)
if len(new_neighbors) >= min_samples:
neighbors = np.union1d(neighbors, new_neighbors)
if labels[j] == 0:
labels[j] = cluster_id
labels = dbscan(X_pca, eps=0.5, min_samples=5)
# 簇的总数
n_clusters = len(set(labels)) - (1 if -1 in labels else 0)
print("簇的总数:", n_clusters)
# 各样本所归属簇的编号
print("各样本所归属簇的编号:", labels)
# 外部指标
from sklearn.metrics import adjusted_rand_score, fowlkes_mallows_score
ri = adjusted_rand_score(y, labels)
fmi = fowlkes_mallows_score(y, labels)
print("RI:", ri)
print("FMI:", fmi)
# 内部指标
from sklearn.metrics import davies_bouldin_score
dbi = davies_bouldin_score(X_pca, labels)
print("DBI:", dbi)
# 可视化输出
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=labels)
plt.show()
```
希望能够帮助到您!
阅读全文
相关推荐
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231044901.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![docx](https://img-home.csdnimg.cn/images/20241231044901.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)