基于欧氏距离,分别以最短距离、平均距离为簇间距离度量对wine数据集进行凝聚层次聚类,在簇数目为3的情况下比较层次聚类和k均值的NMI。
时间: 2024-03-02 15:51:57 浏览: 20
好的,针对你的问题,我来解答一下。
首先,对于wine数据集,我们可以使用欧氏距离来度量样本之间的距离。在凝聚层次聚类中,我们需要选择簇间距离度量方法。最常用的方法包括最短距离、最长距离、平均距离等。
以最短距离和平均距离为例,我们可以使用Python中的scipy库来实现凝聚层次聚类。具体步骤如下:
1. 加载数据集
我们可以使用sklearn库中的load_wine函数来加载wine数据集。
```python
from sklearn.datasets import load_wine
data = load_wine().data
```
2. 凝聚层次聚类
以最短距离为例,代码如下:
```python
from scipy.cluster.hierarchy import linkage, dendrogram
import matplotlib.pyplot as plt
# 计算距离矩阵
dist_matrix = linkage(data, method='single', metric='euclidean')
# 绘制树状图
plt.figure(figsize=(10, 8))
dendrogram(dist_matrix)
plt.show()
```
以平均距离为例,代码如下:
```python
# 计算距离矩阵
dist_matrix = linkage(data, method='average', metric='euclidean')
# 绘制树状图
plt.figure(figsize=(10, 8))
dendrogram(dist_matrix)
plt.show()
```
3. k均值聚类
我们可以使用sklearn库中的KMeans函数来实现k均值聚类。
```python
from sklearn.cluster import KMeans
from sklearn.metrics import normalized_mutual_info_score
# 进行k均值聚类
kmeans = KMeans(n_clusters=3, random_state=0)
kmeans.fit(data)
labels = kmeans.labels_
# 计算NMI
nmi = normalized_mutual_info_score(labels_true, labels)
print('NMI:', nmi)
```
其中,labels_true表示真实的簇标签,可以从wine数据集中获取。
4. 比较聚类结果
我们可以计算凝聚层次聚类和k均值聚类的NMI,并进行比较。
```python
# 计算凝聚层次聚类的NMI
from sklearn.cluster import AgglomerativeClustering
agg = AgglomerativeClustering(n_clusters=3, linkage='average', affinity='euclidean')
agg_labels = agg.fit_predict(data)
agg_nmi = normalized_mutual_info_score(labels_true, agg_labels)
print('Agglomerative Clustering NMI:', agg_nmi)
# 比较聚类结果
print('KMeans NMI:', nmi)
print('Agglomerative Clustering NMI:', agg_nmi)
```
这样,我们就可以比较凝聚层次聚类和k均值聚类的NMI了。
需要注意的是,在实际应用中,我们需要根据具体的问题和数据集选择合适的聚类算法和参数。