赞
踩
一.为什么要了解K-means++算法
K-means算法在数学建模中十分常见,尤其是在解决数学建模C题的时候,K-means++的算法主要是作用于解决聚类问题,通过以一种更有效的方式选择初始聚类中心,可以提高传统Kmeans算法的效率和准确性。这种算法的目标是选择初始化中心点,以便最大程度地减少新的聚类中心之间的平方距离的期望值。ps(这里只是简单的论述,知乎,csdn,b站或是Gitee,Github等网站上都有大佬的详细解释)。这里主要分析在数学建模中KMeans的作用。
二.从数学方面分析KMeans++算法
K-means++是K-means算法的改进版本,它通过改变初始化聚类中心的方法来提高算法的效果。在传统的K-means算法中,初始聚类中心是随机选择的,这可能导致算法陷入局部最优解。而K-means++算法通过以下步骤来选择初始聚类中心:
三.K-means++算法中的简单概念
一句话:物以类聚,人以群分
比如说刚上大学,每位同学需要选择自己喜欢的社团,有的同学喜欢歌唱团,有的同学喜欢计算机,还有的同学喜欢体育,那么每个人喜欢的项目,就是每个人的属性,他们就通过聚集起来,成为一个类别。也就是簇。即将一组N个样本的特征矩阵X划分为K个无交集的簇。下面这个b站up主讲的清晰易懂。
四.K-means++算法在python中的主要运用
因为主要数学建模的C题,而C题主要是完成大量数据的分析,而KMeans算法就可以对大量数据起到分类的主要作用。下面是一段使用python所写的的关于KMeans算法的解释。
- import numpy as np
- from sklearn.cluster import KMeans
-
- # 创建一些随机数据
- data = np.random.rand(100, 2)
-
- # 使用KMeans++算法进行聚类
- kmeans = KMeans(n_clusters=3, init='k-means++')
- kmeans.fit(data)
-
- # 获取聚类中心
- centroids = kmeans.cluster_centers_
-
- # 获取每个数据点的聚类标签
- labels = kmeans.labels_
-
- print("聚类中心:")
- print(centroids)
-
- print("\n数据点的聚类标签:")
- print(labels)

以下是这段代码的分析:
这段代码演示了如何使用Python和scikit-learn库中的KMeans算法通过K-means++初始化方法对随机生成的数据进行聚类。具体解释如下:
首先,导入了NumPy库并给它起了别名np,用于处理数据和数学计算。还导入了scikit-learn库中的K-means模块,用于实现K-means算法。
生成包含100个样本和2个特征的随机数据,该数据代表了一个二维空间中的点集。
创建了一个K-means对象kmeans,将聚类数目设定为3(n_clusters=3),并通过 init='k-means++'
指定了使用K-means++算法进行初始化。
使用数据去拟合K-means模型(kmeans.fit(data)),即对数据进行聚类。
将得到的聚类中心存储在变量centroids中,这些聚类中心是KMeans算法找到的簇的中心点。
将每个数据点的聚类标签存储在变量labels中,即每个数据点被分配给哪个簇。
最后,打印输出聚类中心和每个数据点的聚类标签,以便查看算法的聚类结果。
通过这段代码,我们可以了解如何使用K-means算法通过K-means++初始化方法对数据进行聚类,并了解如何获取聚类中心和数据点的聚类标签。 K-means++算法能够更有效地选择初始聚类中心,提高聚类的效果。
五.在23年的数学建模C题中如何使用K-means++算法
数学建模C题很大一部分考的是数据处理和数据分析,出题方会给出大量的数据,要求答题者需要知道各个表中各个数据之间的联系,并给出相应的数据模型去,而K-means++算法就可以很好的解决数据多而且杂乱的问题。下面就是23年数学建模C题的matlab解决代码。
- clc;clear;close all;
-
- [~, ~, dataA1] = xlsread('第1季度.xlsx', '各个类别的销量');
- A = dataA1(2:end, :);
- A = cell2mat(A);
- % 使用指定范围选择最佳簇个数(K 值)
- fh = @(X,K)(kmeans(X,K));
- eva = evalclusters(A,fh,"CalinskiHarabasz","KList",2:7);
- clear fh
- K = eva.OptimalK;
- clusterIndices = eva.OptimalY;
-
- % 显示簇计算标准值
- figure
- bar(eva.InspectedK,eva.CriterionValues);
- xticks(eva.InspectedK);
- xlabel("分类数目");
- ylabel("分类评价指标-CH值");
- legend("最优分类数目是" + num2str(K));
- title("簇计算标准值图");
- disp("最优分类数目是" + num2str(K));
- % clear eva
-
- % 计算质心
- centroids = grpstats(A,clusterIndices,"mean");
-
- % 显示结果
-
- % 显示二维散点图(PCA)
- figure
- [~,score] = pca(A);
- clusterMeans = grpstats(score,clusterIndices,"mean");
- h = gscatter(score(:,1),score(:,2),clusterIndices,colormap("lines"));
- for i = 1:numel(h)
- h(i).DisplayName = strcat("类型",h(i).DisplayName);
- end
- clear h i score
- hold on
- h = scatter(clusterMeans(:,1),clusterMeans(:,2),50,"kx","LineWidth",2);
- hold off
- h.DisplayName = "聚类方法";
- clear h clusterMeans
- legend;
- title("二维散点图(PCA)");
- xlabel("第一主成分");
- ylabel("第二主成分");
-
- % 矩阵图
- figure
- selectedCols = sort([1,2]);
- [~,ax] = gplotmatrix(A(:,selectedCols),[],clusterIndices,colormap("lines"),[],[],[],"grpbars");
- title("集群数据中列的比较");
- clear K
- clusterMeans = grpstats(A,clusterIndices,"mean");
- hold(ax,"on");
- for i = 1 : size(selectedCols,2)
- for j = 1 : size(selectedCols,2)
- if i ~= j
- scatter(ax(j,i),clusterMeans(:,selectedCols(i)),clusterMeans(:,selectedCols(j)), ...
- 50,"kx","LineWidth",1.5,"DisplayName","聚类方法");
- xlabel(ax(size(selectedCols,2),i),("列" + selectedCols(i)));
- ylabel(ax(i,1),("列" + selectedCols(i)));
- end
- end
- end
- clear ax clusterMeans i j selectedCols
-
- % clusterIndices = eva.OptimalY;% 聚类标签
- % 计算其他评价标准
- eva_CHI=max(eva.CriterionValues);%CHI指数
- eva2 = evalclusters(A,clusterIndices,"DaviesBouldin");%Davies-Bouldin准则
- eva_DBI=eva2.CriterionValues;% DBI指数
- eva3 = evalclusters(A,clusterIndices,"silhouette");%轮廓准则
- eva_SC=eva3.CriterionValues;% 轮廓系数
- %% *优化前后聚类效果指标输出*
-
- disp(['-----------------------','优化前评价指标','--------------------------'])
- disp(['K-means++聚类CHI指数:',num2str(eva_CHI)])
-
- disp(['K-means++聚类DBI指数:',num2str(eva_DBI)])
-
- disp(['K-means++聚类轮廓系数:',num2str(eva_SC)])

六.K-means++算法的优点和缺点
优点:
缺点:
总结
K-means++作为一种无监督聚类算法,在对大量的数据,尤其是大量的多属性数据进行数据分类的时候确实十分实用,近几年的C题需要处理的数据的量越来越多,K-means++算法的使用可以帮助做题人提高自己的效率取得更好的成绩。
ps 我也是作为一个数学建模的新人发表这篇文章仅作为自己的笔记,如果文章当中有错误的地方请体谅。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。