KMean算法精讲

  KMeas算法是一种聚类算法,同时也是一种无监督的算法,即在训练模型时并不需要标签,其主要目的是通过循环迭代,将样本数据分成 K K K类。

基本训练步骤

  • Step1:初始化 K K K个聚类中心(不必是真是的样本)
  • Step2:分别计算所有样本点到这 K K K个聚类中心的距离,并把样本点划分至距离最近的group
  • Step3:针对于每个group,计算其组内的平均点作为新的聚类中心(例如用户有年龄、性别两个特征,针对于年龄特征直接求平均值即可,对于性别特征使用onehot编码,每个纬度都求其平均值即可)
  • Step4:重复步骤2和3直到满足终止条件

其基本过程如下图所示:
在这里插入图片描述

关于KMeans的几个问题

KMeans算法的目标函数是什么?

  已知观测集 ( x 1 , x 2 , . . . , x n ) (x_1,x_2,...,x_n) (x1,x2,...,xn),其中每个观测都是一个d维实向量,k平均聚类要把这

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在MATLAB中,可以使用自带的kmeans函数进行k-means聚类。首先,使用kmeans函数将数据分成指定数量的簇,例如cluster_num=3,即将数据分成3个簇。然后,可以使用unique函数找出分类出的个数,并使用cell数组存储每个簇中的数据索引。接下来,遍历每个簇,获取对应的数据并使用scatter函数绘制散点图表示每个簇的数据。同时,可以使用plot函数绘制簇的中心点。最后,可以计算轮廓系数(SC)来评估聚类效果。轮廓系数可以使用mean函数计算silhouette函数返回的值。整个过程的代码示例如下: ``` cluster_num=3; %自定义分类数 [index_km,center_km]=kmeans(data,cluster_num); %MATLAB自带kmeans函数 a=unique(index_km); %找出分类出的个数 C=cell(1,length(a)); for i=1:length(a) C(1,i)={find(index_km==a(i))}; end figure subplot(2,1,2) for j=1:cluster_num data_get=data(C{1,j},:); scatter(data_get(:,1),data_get(:,2),100,'filled','MarkerFaceAlpha',.6,'MarkerEdgeAlpha',.9); hold on end plot(center_km(:,1),center_km(:,2),'kd','LineWidth',2); hold on sc_k=mean(silhouette(data,index_km)); title_str1=['MATLAB自带kmeans函数',' 聚类数为:',num2str(cluster_num),' SC轮廓系数:',num2str(sc_k)]; title(title_str1); ``` 可以在MATLAB中运行以上代码来进行k-means聚类,并可视化聚类结果。 此外,您还可以参考GitHub的一个示例代码,链接如下:[https://github.com/Qyokizzzz/AI-Algorithm/tree/master/K-means](https://github.com/Qyokizzzz/AI-Algorithm/tree/master/K-means) 。 另外,您还可以通过分析数据,选择最佳的k值进行聚类。例如,可以加载fisheriris数据集,并使用其meas的前两个维度来进行聚类。以下是一个示例脚本: ``` load fisheriris data = normalization(meas); [idx,C,~ = Kmeans(data(:,1:2),3,0,5000); figure gscatter(data(:,1),data(:,2),idx,'bgm') hold on plot(C(:,1),C(:,2),'kx') legend('Cluster 1','Cluster 2','Cluster 3','ClusterCentroid') ``` 上述代码将fisheriris数据集进行了归一化处理,并使用Kmeans函数将数据聚类成3个簇。通过gscatter函数绘制散点图表示不同簇的数据,并使用plot函数绘制簇的中心点。 最后,您还可以编写一个计算"有序属性"距离的函数来计算样本点之间的闵可夫斯基距离。例如,可以使用cal_dist函数计算两个样本点之间的欧氏距离或曼哈顿距离。以下是一个示例代码: ``` function dist = cal_dist(X,p) dim = size(X); sum = 0; for i = 1:dim(2) sum = sum + abs(X(1,i)-X(2,i))^p; end dist = sum^(1/p); end ``` 该函数可以根据指定的p值计算两个样本点之间的闵可夫斯基距离,其中p=2为欧氏距离,p=1为曼哈顿距离。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟炼丹师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值