DIANA鸢尾花聚类可视化python代码并输出轮廓系数

时间: 2023-09-08 13:07:35 浏览: 40
以下是使用Python和Scikit-learn库进行鸢尾花聚类可视化,并输出轮廓系数的代码: ```python import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.decomposition import PCA from sklearn.datasets import load_iris from sklearn.metrics import silhouette_score # 加载数据集 iris = load_iris() X = iris.data y = iris.target # 循环尝试不同的聚类数量,并计算轮廓系数 silhouette_scores = [] for n_clusters in range(2, 7): kmeans = KMeans(n_clusters=n_clusters, random_state=0) cluster_labels = kmeans.fit_predict(X) silhouette_scores.append(silhouette_score(X, cluster_labels)) # 找到最佳聚类数量 best_n_clusters = np.argmax(silhouette_scores) + 2 # 使用最佳聚类数量进行聚类 kmeans = KMeans(n_clusters=best_n_clusters, random_state=0).fit(X) y_kmeans = kmeans.predict(X) # 计算聚类中心并进行PCA降维 pca = PCA(n_components=2) X_pca = pca.fit_transform(X) centers = pca.transform(kmeans.cluster_centers_) # 绘制散点图和聚类中心 plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y_kmeans, cmap='viridis') plt.scatter(centers[:, 0], centers[:, 1], c='black', s=200, alpha=0.5) plt.title('Iris Clustering Results') plt.xlabel('PCA Component 1') plt.ylabel('PCA Component 2') plt.show() # 输出轮廓系数 print("Best Silhouette Score:", max(silhouette_scores)) print("Best Number of Clusters:", best_n_clusters) ``` 代码首先循环尝试不同的聚类数量,并计算每个聚类数量的轮廓系数。然后找到具有最高轮廓系数的聚类数量,并使用该数量进行聚类。最后,计算聚类中心并进行PCA降维,将结果可视化,并输出最佳聚类数量和轮廓系数。

相关推荐

为了更好地理解聚类结果,我们可以将聚类结果可视化出来。下面是对鸢尾花数据集进行 DIANA 聚类并可视化的 Python 代码: python import pandas as pd import numpy as np from scipy.spatial.distance import pdist, squareform import matplotlib.pyplot as plt # 读取数据 iris = pd.read_csv('iris.csv') # 提取特征列 X = iris.iloc[:, :-1].values # 计算距离矩阵 distances = pdist(X, metric='euclidean') # 将距离矩阵转化为方阵 sq_distances = squareform(distances) # 初始化聚类结果 clusters = [[i] for i in range(len(X))] # 迭代聚类过程 while len(clusters) > 1: # 计算各簇之间的距离 cluster_distances = [np.mean(sq_distances[clusters[i], :][:, clusters[j]]) for i in range(len(clusters)) for j in range(i+1, len(clusters))] # 找到距离最近的两个簇 min_index = np.argmin(cluster_distances) i, j = np.unravel_index(min_index, (len(clusters), len(clusters))) # 合并这两个簇 clusters[i] += clusters[j] del clusters[j] # 显示聚类结果 plt.figure(figsize=(10, 8)) colors = ['red', 'blue', 'green'] for i, cluster in enumerate(clusters): plt.scatter(X[cluster, 0], X[cluster, 1], c=colors[i], label='Cluster {}'.format(i+1)) plt.xlabel('Sepal Length') plt.ylabel('Sepal Width') plt.title('DIANA Clustering of Iris Dataset') plt.legend() plt.show() 这段代码与前面的代码类似,只是在聚类结果得到之后,我们使用 matplotlib 库将聚类结果可视化出来。具体地,我们用不同的颜色表示不同的簇,并在图例中标注了每个簇的编号。这里我们只使用了前两个特征(花萼长度和花萼宽度)进行可视化,因为只有两个特征可以直观地表示在二维空间中。 运行上述代码,可以得到以下聚类可视化结果: ![DIANA Clustering of Iris Dataset](https://i.imgur.com/kxJxJ8g.png) 从图中可以看出,DIANA 聚类算法将鸢尾花数据集分为了三个簇,其中蓝色簇(Cluster 2)包含了所有的 Setosa 鸢尾花,而红色簇(Cluster 1)和绿色簇(Cluster 3)则包含了各种 Versicolour 和 Virginica 鸢尾花。这表明 DIANA 聚类算法能够较好地将不同种类的鸢尾花分为不同的簇,从而实现了聚类的目的。
以下是使用Diana分裂聚类算法对鸢尾花数据集进行聚类并可视化的Python代码: python from sklearn.datasets import load_iris import numpy as np import matplotlib.pyplot as plt iris = load_iris() X = iris.data # 定义分裂聚类函数 def diana(X, Kmax): # 初始化聚类中心为所有样本的均值 centers = np.mean(X, axis=0, keepdims=True) # 初始化聚类结果为所有样本所属的簇 labels = np.zeros((X.shape[0], 1)) # 对1到Kmax进行聚类 for k in range(1, Kmax+1): # 找到距离最远的样本 distances = np.sqrt(np.sum((X - centers)**2, axis=1)) farthest_idx = np.argmax(distances) # 将距离最远的样本分为两个簇 c1 = X[labels == labels[farthest_idx], :] c2 = X[labels != labels[farthest_idx], :] # 更新聚类中心 centers[labels == labels[farthest_idx], :] = np.mean(c1, axis=0, keepdims=True) centers[labels != labels[farthest_idx], :] = np.mean(c2, axis=0, keepdims=True) # 更新聚类结果 labels[labels == labels[farthest_idx]] = k labels[labels > labels[farthest_idx]] += 1 return labels # 调用分裂聚类函数 labels = diana(X, Kmax=3) # 绘制聚类结果 plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis') plt.xlabel('Sepal length') plt.ylabel('Sepal width') plt.show() 在这个代码中,我们首先加载鸢尾花数据集,并将数据存储在X变量中。然后,我们定义了一个diana()函数,该函数接受数据和最大聚类数Kmax作为输入,并返回聚类结果。该函数使用Diana分裂聚类算法对1到Kmax进行聚类,找到距离最远的样本,并将其分为两个簇,然后更新聚类中心和聚类结果。重复上述步骤直到得到Kmax个簇。 最后,我们调用diana()函数并将结果存储在变量labels中。然后,我们使用scatter()函数绘制每个样本点的散点图,并使用labels作为颜色映射,以可视化聚类结果。绘制结果如下所示: ![Diana聚类结果可视化](https://i.imgur.com/7hJ0QqP.png) 图中的每个点代表一个样本,不同颜色的点代表不同的簇。通过可视化聚类结果,我们可以更直观地了解数据的聚类结构。
好的,我们可以使用DIANA(Divisive Analysis Clustering)算法来实现对鸢尾花数据集的聚类,并可视化聚类结果。首先,我们需要导入必要的库和数据集: python import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import load_iris iris = load_iris() X = iris.data 然后,我们可以定义一个DIANA函数,该函数将输入数据集、聚类数和最大迭代次数,并返回一个包含每个样本所属聚类的标签的向量。 python from scipy.spatial.distance import pdist, squareform def diana(X, n_clusters, max_iter): # 初始化所有数据为同一个聚类 labels = np.zeros(X.shape[0]) # 对整个数据集进行聚类 centroids = np.mean(X, axis=0) # 设置当前聚类数为1 current_clusters = 1 # 循环迭代,将数据集分裂为n_clusters个聚类 while current_clusters < n_clusters: # 找到最大距离的聚类进行分裂 max_dist = -1 max_cluster_index = -1 for i in range(current_clusters): cluster_data = X[labels==i] # 计算聚类内部点的距离矩阵 dist_matrix = squareform(pdist(cluster_data)) # 计算距离矩阵中的最大距离 max_dist_in_cluster = np.max(dist_matrix) # 记录最大距离的聚类 if max_dist_in_cluster > max_dist: max_dist = max_dist_in_cluster max_cluster_index = i # 对最大距离的聚类进行K-Means聚类 cluster_data = X[labels==max_cluster_index] kmeans = KMeans(n_clusters=2, max_iter=max_iter) kmeans.fit(cluster_data) cluster_labels = kmeans.labels_ # 更新标签 labels[labels==max_cluster_index] = cluster_labels + current_clusters # 更新质心 centroids[max_cluster_index] = np.mean(cluster_data[cluster_labels==0], axis=0) centroids = np.vstack([centroids, np.mean(cluster_data[cluster_labels==1], axis=0)]) current_clusters += 1 return labels 接下来,我们可以使用该函数对鸢尾花数据集进行聚类,并将结果可视化。 python # 将数据集聚类为3个类别 labels = diana(X, 3, 100) # 绘制聚类结果 plt.scatter(X[:, 0], X[:, 1], c=labels) plt.xlabel('Sepal Length') plt.ylabel('Sepal Width') plt.title('Iris Clustering with DIANA') plt.show() 这将生成一个散点图,其中每个点的颜色表示其所属的聚类标签。 ![iris_diana](https://user-images.githubusercontent.com/57250843/135742192-8b3f3a8d-7e60-4a8b-a9f0-7e8e7b5f7d75.png) 这就是使用DIANA算法实现对鸢尾花数据集的聚类并可视化的过程。希望这可以帮助你解决问题。
以下是将分裂聚类函数和可视化代码结合起来对鸢尾花数据集进行聚类并进行可视化的Python代码: python from sklearn.datasets import load_iris import numpy as np import matplotlib.pyplot as plt iris = load_iris() X = iris.data # 定义分裂聚类函数 def diana(X, Kmax): # 初始化聚类中心为所有样本的均值 centers = np.mean(X, axis=0, keepdims=True) # 初始化聚类结果为所有样本所属的簇 labels = np.zeros((X.shape[0], 1)) # 对1到Kmax进行聚类 for k in range(1, Kmax+1): # 找到距离最远的样本 distances = np.sqrt(np.sum((X - centers)**2, axis=1)) farthest_idx = np.argmax(distances) # 将距离最远的样本分为两个簇 c1 = X[labels == labels[farthest_idx], :] c2 = X[labels != labels[farthest_idx], :] # 更新聚类中心 centers[labels == labels[farthest_idx], :] = np.mean(c1, axis=0, keepdims=True) centers[labels != labels[farthest_idx], :] = np.mean(c2, axis=0, keepdims=True) # 更新聚类结果 labels[labels == labels[farthest_idx]] = k labels[labels > labels[farthest_idx]] += 1 # 可视化聚类结果 if X.shape[1] == 2: plt.scatter(X[:, 0], X[:, 1], c=labels) plt.xlabel('Sepal length') plt.ylabel('Sepal width') plt.show() return labels # 调用分裂聚类函数 labels = diana(X, Kmax=3) # 输出聚类结果 print(labels) 在这个代码中,我们首先加载鸢尾花数据集,并将数据存储在X变量中。然后,我们定义了一个diana()函数,该函数接受数据和最大聚类数Kmax作为输入,并返回聚类结果。该函数使用Diana分裂聚类算法对1到Kmax进行聚类,找到距离最远的样本,并将其分为两个簇,然后更新聚类中心和聚类结果。在每次更新聚类结果的同时,我们使用plt.scatter()函数将数据集在二维平面上绘制出来,并根据聚类结果对数据点进行着色。最后,我们调用diana()函数并将结果存储在变量labels中,然后输出聚类结果。 运行上述代码,我们可以看到在每次更新聚类结果时,程序会弹出一个可视化窗口显示当前的聚类结果,可以看到随着聚类的进行,每个样本被分配到不同的簇中。最终的聚类结果可视化图如下: ![image.png](https://cdn.nlark.com/yuque/0/2021/png/236174/1632923994689-1d5696e7-9e5e-44a5-9cdd-302f9e5a1f08.png#clientId=u7b8f5e57-1c4c-4&from=paste&height=244&id=u4a9f3ff0&margin=%5Bobject%20Object%5D&name=image.png&originHeight=488&originWidth=501&originalType=binary&ratio=1&size=26297&status=done&style=none&taskId=u5d2e6d6e-7a9c-49c9-9f4a-7b06c6f7672)

最新推荐

Python在线考试系统前端-大学毕业设计-基于vue.zip

Python在线考试系统前端-大学毕业设计-基于vue

Python各种图像注意力模块的实现.zip

注意力机制

300161华中数控财务报告资产负债利润现金流量表企业治理结构股票交易研发创新等1391个指标(2007-2022).xlsx

包含1391个指标,其说明文档参考: https://blog.csdn.net/yushibing717/article/details/136115027 数据来源:基于上市公司公告数据整理 数据期间:从具体上市公司上市那一年开始-2022年度的数据,年度数据 包含各上市公司股票的、多年度的上市公司财务报表资产负债表、上市公司财务报表利润表、上市公司财务报表现金流量表间接法、直接法四表合在一个面板里面,方便比较和分析利用 含各个上市公司股票的、多年度的 偿债能力 披露财务指标 比率结构 经营能力 盈利能力 现金流量分析 风险水平 发展能力 每股指标 相对价值指标 股利分配 11类财务指标分析数据合在一个面板里面,方便比较和分析利用 含上市公司公告的公司治理、股权结构、审计、诉讼等数据 包含1391个指标,如: 股票简称 证券ID 注册具体地址 公司办公地址 办公地址邮政编码 董事会秘书 董秘联系电话 董秘传真 董秘电子邮箱 ..... 货币资金 其中:客户资金存款 结算备付金 其中:客户备付金 .........

【路径规划】基于matlab蚁狮算法栅格地图机器人最短路径规划【含Matlab源码 3065期】.mp4

CSDN佛怒唐莲上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描视频QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

手机wrap网站html5微信圣诞节点灯送礼专题模板

手机wrap网站html5微信圣诞节点灯送礼专题模板本资源系百度网盘分享地址

DAC简介及参考电路PPT学习教案.pptx

DAC简介及参考电路PPT学习教案.pptx

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire

OceanBase数据库简介及原理解析

# 1. OceanBase数据库概述 ## 1.1 OceanBase数据库的发展历程 OceanBase数据库是由阿里巴巴集团自主研发的一款分布式关系型数据库系统,起源于阿里集团的业务需求和技术挑战。自2010年开始研发,经过多年的迭代和优化,OceanBase已经成为阿里巴巴集团重要的核心数据库产品之一。在实际的业务场景中,OceanBase已经被广泛应用于金融、电商、物流等各个领域。 ## 1.2 OceanBase数据库的特点和优势 OceanBase数据库具有以下特点和优势: - **分布式架构**:OceanBase采用多副本分布式架构,可以实现高可用和数据容灾。 -

python的pandas读取excel怎么将excel表里的列从1开始而不是0

在 Pandas 中,数据框的列默认从0开始编号,但我们可以通过自定义函数来进行数据列的转换。可以先将读取的数据框列的第一个值设为1,然后对后续列进行递增处理。 以下是示例代码: ```python import pandas as pd # 读取 Excel 文件 df = pd.read_excel('your_excel_file.xlsx') # 定义函数将列从1开始 def reset_column(x): return str(int(x) + 1) # 应用函数到所有列名 df = df.rename(columns=reset_column) # 打印数据框

第三章薪酬水平、薪酬系统的运行与控制.pptx

第三章薪酬水平、薪酬系统的运行与控制.pptx