数学建模中的K-means++算法

一.为什么要了解K-means++算法

        K-means算法在数学建模中十分常见,尤其是在解决数学建模C题的时候,K-means++的算法主要是作用于解决聚类问题,通过以一种更有效的方式选择初始聚类中心,可以提高传统Kmeans算法的效率和准确性。这种算法的目标是选择初始化中心点,以便最大程度地减少新的聚类中心之间的平方距离的期望值。ps(这里只是简单的论述,知乎,csdn,b站或是Gitee,Github等网站上都有大佬的详细解释)。这里主要分析在数学建模中KMeans的作用。

二.从数学方面分析KMeans++算法

        K-means++是K-means算法的改进版本,它通过改变初始化聚类中心的方法来提高算法的效果。在传统的K-means算法中,初始聚类中心是随机选择的,这可能导致算法陷入局部最优解。而K-means++算法通过以下步骤来选择初始聚类中心:

  1. 从数据集中随机选择一个数据点作为第一个聚类中心。
  2. 对于每一个数据点,计算它与当前已选的聚类中心的最短距离(即与最近的聚类中心的距离)。
  3. 根据每个数据点到最近聚类中心的距离的平方作为权重,随机选择下一个聚类中心,距离较远的数据点具有更大的概率被选作聚类中心。
  4. 重复步骤2和3,直到选择出预定数量的聚类中心。

三.K-means++算法中的简单概念

        一句话:物以类聚,人以群分

        比如说刚上大学,每位同学需要选择自己喜欢的社团,有的同学喜欢歌唱团,有的同学喜欢计算机,还有的同学喜欢体育,那么每个人喜欢的项目,就是每个人的属性,他们就通过聚集起来,成为一个类别。也就是簇。即将一组N个样本的特征矩阵X划分为K个无交集的簇。下面这个b站up主讲的清晰易懂。

        http://【【五分钟机器学习】物以类聚的Kmeans】 https://www.bilibili.com/video/BV1ei4y1V7hX/?share_source=copy_web&vd_source=f0278c181e3b30e7299892957a6dbe6a

四.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++初始化方法对随机生成的数据进行聚类。具体解释如下:

  1. 首先,导入了NumPy库并给它起了别名np,用于处理数据和数学计算。还导入了scikit-learn库中的K-means模块,用于实现K-means算法。

  2. 生成包含100个样本和2个特征的随机数据,该数据代表了一个二维空间中的点集。

  3. 创建了一个K-means对象kmeans,将聚类数目设定为3(n_clusters=3),并通过 init='k-means++' 指定了使用K-means++算法进行初始化。

  4. 使用数据去拟合K-means模型(kmeans.fit(data)),即对数据进行聚类。

  5. 将得到的聚类中心存储在变量centroids中,这些聚类中心是KMeans算法找到的簇的中心点。

  6. 将每个数据点的聚类标签存储在变量labels中,即每个数据点被分配给哪个簇。

  7. 最后,打印输出聚类中心和每个数据点的聚类标签,以便查看算法的聚类结果。

通过这段代码,我们可以了解如何使用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++算法的优点和缺点

        

优点:

  1. 算法简单,易于实现和理解。
  2. 能够处理大规模数据集。
  3. 可以在没有先验知识的情况下对数据进行聚类。
  4. 可以灵活地选择簇的个数。
  5. 是一种迭代算法,能够找到全局最优解。

缺点:

  1. 对初始聚类中心的选择敏感,可能影响最终的聚类结果。
  2. 可能收敛到局部最优解,无法保证得到全局最优解。
  3. 对数据分布不均匀或者簇形状不规则的数据集效果不好。
  4. 对噪声和异常值敏感,可能导致聚类结果不稳定。
  5. 需要预先设定簇的数量,对于不确定簇数量的数据集处理不方便。

总结

        K-means++作为一种无监督聚类算法,在对大量的数据,尤其是大量的多属性数据进行数据分类的时候确实十分实用,近几年的C题需要处理的数据的量越来越多,K-means++算法的使用可以帮助做题人提高自己的效率取得更好的成绩。

        ps 我也是作为一个数学建模的新人发表这篇文章仅作为自己的笔记,如果文章当中有错误的地方请体谅。

  • 19
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值