k-Means算法Matlab实现
2016-03-25 15:58
519 查看
clc;
clear;
%读取数据文件,生成点矩阵
fileID = fopen('D:\matlabFile\data.txt');
C=textscan(fileID,'%f %f');
fclose(fileID);
%显示数组结果
%celldisp(C);
%将cell类型转换为矩阵类型,这里只假设原数据为二维属性,且是二维的坐标点
CC_init=cat(2,C{1},C{2});%用来保存初始加载的值
CC=CC_init;
%获得对象的数量
num=length(C{1});
%显示初始分布图
%scatter(C{1},C{2},'filled');
%%设置任意k个簇
k=3;
%临时存放k个中心点的数组
C_temp=zeros(k,2);
%判断所设置的k值是否小于对象的数量
if k<num
%产生随机的k个整数
randC=randperm(num);
randC=randC(1:k);
%从原数组中提出这三个点
for i=1:k
C_temp(i,:)=CC(randC(1,i),:);
end
%将原数组中的这三个点清空
for j=1:k
CC(randC(1,j),:)=zeros(1,2);
end
idZero=find(CC(:,1)==0);
%删除为零的行
[i1,j1]=find(CC==0);
row=unique(i1);
CC(row,:)=[];
%分配k个二维数组,用来存放聚类点
%分配行为k的存储单元
cluster=cell(k,1,1);
%将剔除的三个点加入到对应的三个存储单元,每个单元的第一行置为0,为了存储相对应的簇中心
for m=1:k
cluster{m}=cat(1,zeros(1,2),C_temp(m,:));
end
%计算其他点到这k个点的距离,然后分配这些点,第一次遍历
for ii=1:num-k
%分别计算到三个点的距离
minValue=1000000;%最小值,要根据实际情况设定该值
minNum=-1;%最小值序号
for jj=1:k
if minValue>sqrt((CC(ii,1)-C_temp(jj,1))*(CC(ii,1)-C_temp(jj,1))+(CC(ii,2)-C_temp(jj,2))*(CC(ii,2)-C_temp(jj,2)))
minValue=sqrt((CC(ii,1)-C_temp(jj,1))*(CC(ii,1)-C_temp(jj,1))+(CC(ii,2)-C_temp(jj,2))*(CC(ii,2)-C_temp(jj,2)));
minNum=jj;
end
end
cluster{minNum}=cat(1,cluster{minNum},CC(ii,:));
end
%初次计算簇中心
for n=1:k
c=cluster{n};
c(1,:)=[];
cluster{n}(1,:)=mean(c,1);
end
%下面重复计算簇中心,直到没有变化为止
flag=1;
count=0;
while flag==1
%将cluster除第一行之外的数据全部清空
for i=1:k
c=cluster{i}(1,:);
cluster{i}=[];
cluster{i}=c;
end
%把所有点重新分簇
for j=1:num
minValue=1000000;%最小值,要根据实际情况设定该值
minNum=-1;%最小值序号
for i=1:k
if minValue>sqrt((CC_init(j,1)-cluster{i}(1,1))*(CC_init(j,1)-cluster{i}(1,1))+(CC_init(j,2)-cluster{i}(1,2))*(CC_init(j,2)-cluster{i}(1,2)))
minValue=sqrt((CC_init(j,1)-cluster{i}(1,1))*(CC_init(j,1)-cluster{i}(1,1))+(CC_init(j,2)-cluster{i}(1,2))*(CC_init(j,2)-cluster{i}(1,2)));
minNum=i;
end
end
cluster{minNum}=cat(1,cluster{minNum},CC_init(j,:));
end
%再次计算簇中心,并与原簇中心进行比较
flag1=1;
for n=1:k
c_base=cluster{n}(1,:);
c=cluster{n};
c(1,:)=[];
cluster{n}(1,:)=mean(c,1);
c_base=c_base-cluster{n}(1,:);
if c_base~=0
flag1=0;
end
end
if flag1==0
flag=1;
else
flag=0;
end
count=count+1;
end
%绘制聚类结果
for i=1:k
scatter(cluster{i}(:,1),cluster{i}(:,2),'filled');
hold on
end
end
clear;
%读取数据文件,生成点矩阵
fileID = fopen('D:\matlabFile\data.txt');
C=textscan(fileID,'%f %f');
fclose(fileID);
%显示数组结果
%celldisp(C);
%将cell类型转换为矩阵类型,这里只假设原数据为二维属性,且是二维的坐标点
CC_init=cat(2,C{1},C{2});%用来保存初始加载的值
CC=CC_init;
%获得对象的数量
num=length(C{1});
%显示初始分布图
%scatter(C{1},C{2},'filled');
%%设置任意k个簇
k=3;
%临时存放k个中心点的数组
C_temp=zeros(k,2);
%判断所设置的k值是否小于对象的数量
if k<num
%产生随机的k个整数
randC=randperm(num);
randC=randC(1:k);
%从原数组中提出这三个点
for i=1:k
C_temp(i,:)=CC(randC(1,i),:);
end
%将原数组中的这三个点清空
for j=1:k
CC(randC(1,j),:)=zeros(1,2);
end
idZero=find(CC(:,1)==0);
%删除为零的行
[i1,j1]=find(CC==0);
row=unique(i1);
CC(row,:)=[];
%分配k个二维数组,用来存放聚类点
%分配行为k的存储单元
cluster=cell(k,1,1);
%将剔除的三个点加入到对应的三个存储单元,每个单元的第一行置为0,为了存储相对应的簇中心
for m=1:k
cluster{m}=cat(1,zeros(1,2),C_temp(m,:));
end
%计算其他点到这k个点的距离,然后分配这些点,第一次遍历
for ii=1:num-k
%分别计算到三个点的距离
minValue=1000000;%最小值,要根据实际情况设定该值
minNum=-1;%最小值序号
for jj=1:k
if minValue>sqrt((CC(ii,1)-C_temp(jj,1))*(CC(ii,1)-C_temp(jj,1))+(CC(ii,2)-C_temp(jj,2))*(CC(ii,2)-C_temp(jj,2)))
minValue=sqrt((CC(ii,1)-C_temp(jj,1))*(CC(ii,1)-C_temp(jj,1))+(CC(ii,2)-C_temp(jj,2))*(CC(ii,2)-C_temp(jj,2)));
minNum=jj;
end
end
cluster{minNum}=cat(1,cluster{minNum},CC(ii,:));
end
%初次计算簇中心
for n=1:k
c=cluster{n};
c(1,:)=[];
cluster{n}(1,:)=mean(c,1);
end
%下面重复计算簇中心,直到没有变化为止
flag=1;
count=0;
while flag==1
%将cluster除第一行之外的数据全部清空
for i=1:k
c=cluster{i}(1,:);
cluster{i}=[];
cluster{i}=c;
end
%把所有点重新分簇
for j=1:num
minValue=1000000;%最小值,要根据实际情况设定该值
minNum=-1;%最小值序号
for i=1:k
if minValue>sqrt((CC_init(j,1)-cluster{i}(1,1))*(CC_init(j,1)-cluster{i}(1,1))+(CC_init(j,2)-cluster{i}(1,2))*(CC_init(j,2)-cluster{i}(1,2)))
minValue=sqrt((CC_init(j,1)-cluster{i}(1,1))*(CC_init(j,1)-cluster{i}(1,1))+(CC_init(j,2)-cluster{i}(1,2))*(CC_init(j,2)-cluster{i}(1,2)));
minNum=i;
end
end
cluster{minNum}=cat(1,cluster{minNum},CC_init(j,:));
end
%再次计算簇中心,并与原簇中心进行比较
flag1=1;
for n=1:k
c_base=cluster{n}(1,:);
c=cluster{n};
c(1,:)=[];
cluster{n}(1,:)=mean(c,1);
c_base=c_base-cluster{n}(1,:);
if c_base~=0
flag1=0;
end
end
if flag1==0
flag=1;
else
flag=0;
end
count=count+1;
end
%绘制聚类结果
for i=1:k
scatter(cluster{i}(:,1),cluster{i}(:,2),'filled');
hold on
end
end
相关文章推荐
- 解析在main函数之前调用函数以及对设计的作用详解
- 详解Matlab中 sort 函数用法
- 数据挖掘之Apriori算法详解和Python实现代码分享
- java和matlab画多边形闭合折线图示例讲解
- C#调用Matlab生成的dll方法的详细说明
- 简述Matlab中size()函数的用法
- 从java中调用matlab详细介绍
- 详解BI/数据分析/数据挖掘/业务分析概念 7fe0
- Sedgewick之巨著《算法》,与高德纳TAOCP一脉相承
- 普通最小二乘法的推导证明
- 稀疏自动编码器 (Sparse Autoencoder)
- 详解Matlab中 sort 函数用法
- 简述Matlab中size()函数的用法
- 最老程序员创业札记:全文检索、数据挖掘、推荐引擎应用2
- 数据挖掘项目的特征和关键环节
- 聚类算法总结
- 一位数据挖掘成功人士给数据挖掘在读研究生的建议
- 数据挖掘网上资料大全
- 数据挖掘技术与用户知识获取