用matlab实现k-means聚类
本文是大三下学期课程《数据分析方法》中的一些简单实现,部分内容摘自《大数据分析:方法和应用》一书。本文仅作为学习总结用,不作商用
本文思路:
聚类的概念
k-means算法的思路和步骤
matlab的实现
运行结果分析
一、聚类的概念
聚类是数据挖掘比较常见的方法,也相对比较简单。
聚类分析的目的在于把分类对象按一定的规则分成若干类,这些类没有预先给定,而是根据数据的特征而确定的,对于类的数目以及类的结构不用作任何假定。聚类和分类是不一样的,聚类的类似并没有事先确定,聚类属于搜索簇的无监督学习过程。而分类,就是根据文本的特征或属性,将待分类点划分到已有的类别中。分类属于有监督学习。
聚类分析根据分类对象的不同还分为Q型聚类分析和R型聚类分析。Q型聚类分析是指对样品的聚类,R型聚类分析是指对变量的聚类。
二、k-means算法的思路和步骤
k-means算法是一种应用范围比较广的聚类方法。其思想在于在给定的聚类数k时,通过最小化组内误差平方和来得到每一个样本点的分类。
步骤:
- 1.先在所有的样本(n个)中随机选择k个样本点作为初始的聚类中心;
- 2.计算k个聚类中心到剩下的n-k个样本点的距离,根据剩下的n-k个样与聚类中心的距离,分别将它们分到与其最近的中心的类中;
- 3.计算每个新类的聚类中心;
- 4.重复2、3,直到所有样本点的分类不再改变或者类中心不再改变。
三、matlab的实现
由于我使用的是学生成绩作为训练集,学生成绩分为两类(及格和不及格),因此在训练的时候,k=2,这里的k是通用的,可以是其他值。
使用工具:matlab2015b
训练集:88个学生成绩,每个样本维数为2,平时成绩和期末成绩,其中及格人数为51,不及格人数为37。
程序一
这个程序是刚开始做的,当时想着找一个“容器”来储存类别,后来发现元胞数组能实现这种功能(储存“一堆”行数不同的矩阵),元胞数组其实有点像R语言中的“dataframe”,其中的元素可以多种多样
function [Class,temp,new_C,iter] =k_means(train,k)
%train是训练的样本,k是自行设定的聚类数
%这个程序是针对k的聚类,元胞数组,添加了IDX
[n,dim]=size(train);
train=[train zeros(n,1)];
r=randsample(n,k);%r是从n中随机不重复抽出k个整数
C=train(r,1:end-1);delta=ones(1,1);
tao=0.001;iter=0;
while delta>=tao
D=[];train(:,end)=0;
%计算样本到聚类中心的距离
for j=1:k
D=[D,sqrt(sum((repmat(C(j,:),n,1)-train(:,1:end-1)).^2,2))];
end
Class=cell(k,1);%将样本归类
for i=1:n
[~,d]=min(D(i,:));
Class{d,1}(i,:)=train(i,:);
train(i,dim+1)=d;
end
new_C=zeros(k,dim);
%计算新的聚类中心
for j=1:k
M=cell2mat(Class(j,1)); M(all(M==0,2),:)=[]; Class{j,1}=M;
new_C(