请用Python对鸢尾花数据集进行层次聚类,在不同的距离定义下:找到最佳类别数、对结果进行对比分析、选择最贴近数据的距离定义绘制谱系图并输出结果、绘制划分标识和原标识的交叉列表、计算兰德指数
时间: 2023-12-24 11:05:55 浏览: 85
好的,让我们来一步步实现。
首先,我们需要加载鸢尾花数据集,并进行数据预处理和标准化。这里我们可以使用sklearn库来加载数据集并进行标准化处理。
```python
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
iris = load_iris()
X = iris.data
y = iris.target
scaler = StandardScaler()
X = scaler.fit_transform(X)
```
接下来,我们可以使用scipy库中的层次聚类函数来进行聚类。在这里,我们可以选择不同的距离定义方法和聚类算法。这里我们选择使用曼哈顿距离和平均链接聚类算法来进行聚类。
```python
from scipy.cluster.hierarchy import linkage, dendrogram
methods = ['single', 'complete', 'average', 'weighted', 'centroid', 'median', 'ward']
for method in methods:
Z = linkage(X, method=method, metric='cityblock')
dendrogram(Z)
plt.title('Dendrogram ({})'.format(method))
plt.xlabel('Samples')
plt.ylabel('Distance')
plt.show()
```
这里我们将不同距离定义方法下的谱系图都绘制出来,以便我们选择最贴近数据的距离定义方法。
接下来,我们可以使用轮廓系数等指标来找到最佳类别数。这里我们可以使用sklearn库中的KMeans聚类算法来进行聚类,并且计算轮廓系数。
```python
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
for k in range(2, 6):
kmeans = KMeans(n_clusters=k, random_state=1)
y_pred = kmeans.fit_predict(X)
score = silhouette_score(X, y_pred)
print('k={}, silhouette score={:.2f}'.format(k, score))
```
这里我们选择将类别数k设置为2到5,计算出每个k值对应的轮廓系数。
接下来,我们可以选择最贴近数据的距离定义方法,绘制谱系图并输出结果。
```python
Z = linkage(X, method='weighted', metric='cityblock')
dn = dendrogram(Z)
plt.title('Dendrogram (weighted)')
plt.xlabel('Samples')
plt.ylabel('Distance')
plt.show()
y_pred = fcluster(Z, t=2, criterion='maxclust')
print('Rand Index: {:.2f}'.format(rand_score(y, y_pred)))
```
这里我们选择使用加权平均距离作为距离定义方法,将类别数设置为2,绘制出谱系图,并计算出兰德指数。
最后,我们可以绘制划分标识和原标识的交叉列表,并计算出兰德指数。
```python
from sklearn.metrics import confusion_matrix
confusion = confusion_matrix(y, y_pred)
print(confusion)
plt.imshow(confusion, cmap='Blues', interpolation='nearest')
plt.colorbar()
plt.xticks([0, 1, 2], ['Setosa', 'Versicolor', 'Virginica'])
plt.yticks([0, 1, 2], ['Setosa', 'Versicolor', 'Virginica'])
plt.xlabel('Predicted Class')
plt.ylabel('True Class')
plt.title('Confusion Matrix')
plt.show()
print('Rand Index: {:.2f}'.format(rand_score(y, y_pred)))
```
这里我们使用sklearn库中的混淆矩阵函数来绘制交叉列表,并计算出兰德指数。
完整代码如下:
阅读全文
相关推荐


















