C均值聚类算法及其实现
C-均值聚类算法是动态聚类算法的一种
动态聚类——兼顾系统聚类和分解聚类
下文文字描述居多,公式较少放心食用。
首先给出聚类准则函数是误差平方和准则:
Jc=∑j=1c∑k=1nj∣∣xk−mj∣∣2J_{c}=\sum_{j=1}^{c}\sum_{k=1}^{n_{j}}||x_{k}-m_{j}||^{2}Jc=∑j=1c∑k=1nj∣∣xk−mj∣∣2
其中ccc代表类数,njn_{j}nj代表jjj类的样本数
(1)C-均值算法(一)
1.从混合样本中抽取c个初始聚合中心。
2.计算每个样本到每个聚合中心的距离(这里用欧式距离De(x,y)=∑i=1d∣xi−yi∣2D_{e}(x,y)=\sqrt{\sum_{i=1}^{d}|x_{i}-y_{i}|^{2}}De(x,y)=∑i=1d∣xi−yi∣2),距离哪个中心近就归入哪类(这很好理解)
3.计算ccc个新的聚类中心(由于有新的样本进入聚类),计算公式就是求均值。(这里可以每个样本分类后更新聚类中心,也可以全部样本分类后统一更新聚类中心,分别为逐个处理法与批处理法,针对(一)算法实现用批处理法)
4.判断所有聚类中心如果与上次分类后的中心不同则返回第二步,否则算法结束。(这里是因为如果经过计算分类后聚类中心有变化,说明又改进,就不结束,如果已经收敛,没有改进了,就结束。)
(2)C-均值算法(二)
均值算法(二)是对(一)的改进
1.执行C-均值算法(一)的1,2,3步。(这里实现也采用批处理)
2.计算误差平方和(也就是准则函数),计算:
ρii=nini−1∣∣xk(i)−Zi(I)∣∣2,i=1,2,...,c\rho_{ii}=\frac{n_{i}}{n_{i}-1}||x_{k}^{(i)}-Z_{i}(I)||^{2},i=1,2,...,cρii=ni−1ni∣∣xk(i)−Zi(I)∣∣2,i=1,2,...,c
ρii\rho_{ii}ρii表示使准则函数减小的部分
ρij=njnj+1∣∣xk(i)−Zj(I)∣∣2,j=1,2,...,cj≠i\rho_{ij}=\frac{n_{j}}{n_{j}+1}||x_{k}^{(i)}-Z_{j}(I)||^{2},j=1,2,...,c \qquad j\ne iρij=nj+1nj∣∣xk(i)−Zj(I)∣∣2,j=1,2,...,cj=i
ρij\rho_{ij}ρij表示使准则函数增加的部分
其中iii代表第iii类,jjj代表第jjj类,nnn代表聚类中样本数,xk(i)x_{k}^{(i)}xk(i)代表第iii类第kkk个样本,ZZZ代表聚类中心,III代表第III次迭代值。
找出ρij\rho_{ij}ρij中的最小值ρil\rho_{il}ρil,如果此最小值小于ρii\rho_{ii}ρii,说明存在能够使聚类准则函数减小的操作。即把样本xk(i)x_{k}^{(i)}xk(i)移动到聚类中心wlw_{l}wl中。
3.经过移动操作后修改聚合中心与准则函数JcJ_{c}Jc的值。
Zi(I+1)=Zi(I)+1ni−1[Zi(I)−xk(i)]Z_{i}(I+1)=Z_{i}(I)+\frac{1}{n_{i}-1}\left[Z_{i}(I)-x_{k}^{(i)}\right]Zi(I+1)=Zi(I)+ni−11[Zi(I)−xk(i)]
Zl(I+1)=Zj(I)−1nl+1[Zl(I)−xk(i)]Z_{l}(I+1)=Z_{j}(I)-\frac{1}{n_{l}+1}\left[Z_{l}(I)-x_{k}^{(i)}\right]Zl(I+1)=Zj(I)−nl+11[Zl(I)−xk(i)]
Jc(I+1)=Jc(I)−(ρii−ρil)J_{c}(I+1)=J_{c}(I)-\left(\rho_{i i}-\rho_{i l}\right)Jc(I+1)=Jc(I)−(ρii−ρil)
4.若Jc(I+1)<Jc(I)J_{c}(I+1)<J_{c}(I)Jc(I+1)<Jc(I)则I=I+1I=I+1I=I+1返回2,否则算法结束。
太懒了,搁置了好久了,好多细节都忘了,所以直接上代码:
代码是分类IRIS数据集的,语言MATLAB R2017a,分类精度在89.33%,第一种均值算法相较于第二种算法更容易陷入局部最优(精度在66.67%)。
%% C均值算法对于IRIS数据集的分类(一)
%% author:mym NJUST
clear;
clc;
[number,txt,raw]=xlsread('iris.csv');
%对数据集乱序
index=randperm(150);
rand_number=number(index,:);
kind=3;%类别数
prime_index=sort(randperm(150,3));
m=number(prime_index,2:5);%初始随机选择的三个聚类中心
kind1=0;%记录每类的数目
kind2=0;
kind3=0;
m1=zeros(3,4);
while ~isequal(m,m1)m1=m;
for i=1:150D1=norm(rand_number(i,2:5)-m(1,:));D2=norm(rand_number(i,2:5)-m(2,:));D3=norm(rand_number(i,2:5)-m(3,:));%计算样本到聚类中心的欧式距离vec=[D1 D2 D3];[M,I]=min(vec);if I==1kind1=kind1+1;Kone(kind1)=rand_number(i,1);elseif I==2kind2=kind2+1;Ktwo(kind2)=rand_number(i,1);elsekind3=kind3+1;Kthree(kind3)=rand_number(i,1);%将样本放入聚类endend
if kind1~=0m(1,:)=sum(number(Kone,2:5),1)/kind1;
end
if kind2~=0m(2,:)=sum(number(Ktwo,2:5),1)/kind2;
end
if kind3~=0m(3,:)=sum(number(Kthree,2:5),1)/kind3;%更新聚类中心
end
kind1=0;
kind2=0;
kind3=0;
Kone_store=Kone;
Ktwo_store=Ktwo;
Kthree_store=Kthree;%分类结果
clear Kone Ktwo Kthree;
end
JC=ERR(number,Kone_store,m(1,:))+ERR(number,Ktwo_store,m(2,:))+ERR(number,Kthree_store,m(3,:));
%% 计算准确率
count=0;
count1=0;
count2=0;
count3=0;
[~,n]=size(Kone_store);
for i=1:nif Kone_store(i)<=50count1=count1+1; elseif Kone_store(i)>100count2=count2+1;elsecount3=count3+1;end
end
flag=[count1 count2 count3];
[a,b]=max(flag);
count=count+a;count1=0;
count2=0;
count3=0;
[~,n]=size(Ktwo_store);
for i=1:nif Ktwo_store(i)<=50count1=count1+1; elseif Ktwo_store(i)>100count2=count2+1;elsecount3=count3+1;end
end
flag=[count1 count2 count3];
[a,b]=max(flag);
count=count+a;count1=0;
count2=0;
count3=0;
[~,n]=size(Kthree_store);
for i=1:nif Kthree_store(i)<=50count1=count1+1; elseif Kthree_store(i)>100count2=count2+1;elsecount3=count3+1;end
end
flag=[count1 count2 count3];
[a,b]=max(flag);
count=count+a;
acc=count/150;
%% C均值算法对于IRIS数据集的分类(二)
%% author:mym NJUST
clear;
clc;
[number,txt,raw]=xlsread('iris.csv');
%对数据集乱序
index=randperm(150);
rand_number=number(index,:);
kind=3;%类别数
prime_index=randperm(150,3);
m=number(prime_index,2:5);%初始随机选择的三个聚类中心
kind1=0;%记录每类的数目
kind2=0;
kind3=0;
%% 第一步:初步分为三类
for i=1:150D1=norm(rand_number(i,2:5)-m(1,:));D2=norm(rand_number(i,2:5)-m(2,:));D3=norm(rand_number(i,2:5)-m(3,:));%计算样本到聚类中心的欧式距离vec=[D1 D2 D3];[M,I]=min(vec);if I==1kind1=kind1+1;Kone(kind1)=rand_number(i,1);elseif I==2kind2=kind2+1;Ktwo(kind2)=rand_number(i,1);elsekind3=kind3+1;Kthree(kind3)=rand_number(i,1);%将样本放入聚类end
end
%分类后重新计算聚类中心
if kind1~=0m(1,:)=sum(number(Kone,2:5),1)/kind1;
end
if kind2~=0m(2,:)=sum(number(Ktwo,2:5),1)/kind2;
end
if kind3~=0m(3,:)=sum(number(Kthree,2:5),1)/kind3;%更新聚类中心
end%% 修正聚类
%计算误差平方和
JC=zeros(1,150);
JC(1)=ERR(number,Kone,m(1,:))+ERR(number,Ktwo,m(2,:))+ERR(number,Kthree,m(3,:));
J_number=1;
J_last=0;
p=zeros(3,3);while J_last~=JC(J_number)
J_last=JC(J_number);
[row1,col1]=size(Kone);
count1=1;
%对聚类(一)中的样本进行修正
while count1<=col1p(1,1)=kind1/(kind1-1)*(norm(number(Kone(count1),2:5)-m(1,:))^2);p(1,2)=kind2/(kind2+1)*(norm(number(Kone(count1),2:5)-m(2,:))^2);p(1,3)=kind3/(kind3+1)*(norm(number(Kone(count1),2:5)-m(3,:))^2);[min_value,min_index]=min(p(1,2:3));if min_value<p(1,1)m(1,:)=m(1,:)+1/(kind1-1)*(m(1,:)-number(Kone(count1),2:5)); if min_index==1m(2,:)=m(2,:)-1/(kind2+1)*(m(2,:)-number(Kone(count1),2:5));kind2=kind2+1;Ktwo=Add(Ktwo,Kone(count1));J_number=J_number+1;JC(J_number)=JC(J_number-1)-(p(1,1)-p(1,2));elsem(3,:)=m(3,:)-1/(kind3+1)*(m(3,:)-number(Kone(count1),2:5));kind3=kind3+1;Kthree=Add(Kthree,Kone(count1));J_number=J_number+1;JC(J_number)=JC(J_number-1)-(p(1,1)-p(1,3));endkind1=kind1-1;Kone=Remove(Kone,count1);col1=col1-1;elsecount1=count1+1;J_number=J_number+1;JC(J_number)=JC(J_number-1);end
end
count2=1;
%对聚类(二)中的样本进行修正
[row2,col2]=size(Ktwo);
while count2<=col2p(2,1)=kind1/(kind1+1)*(norm(number(Ktwo(count2),2:5)-m(1,:))^2);p(2,2)=kind2/(kind2-1)*(norm(number(Ktwo(count2),2:5)-m(2,:))^2);p(2,3)=kind3/(kind3+1)*(norm(number(Ktwo(count2),2:5)-m(3,:))^2);[min_value,min_index]=min([p(2,1) p(2,3)]);if min_value<p(2,2)m(2,:)=m(2,:)+1/(kind2-1)*(m(2,:)-number(Ktwo(count2),2:5)); if min_index==1m(1,:)=m(1,:)-1/(kind1+1)*(m(1,:)-number(Ktwo(count2),2:5));kind1=kind1+1;Kone=Add(Kone,Ktwo(count2));J_number=J_number+1;JC(J_number)=JC(J_number-1)-(p(2,2)-p(2,1));elsem(3,:)=m(3,:)-1/(kind3+1)*(m(3,:)-number(Ktwo(count2),2:5));kind3=kind3+1;Kthree=Add(Kthree,Ktwo(count2));J_number=J_number+1;JC(J_number)=JC(J_number-1)-(p(2,2)-p(2,3));endkind2=kind2-1;Ktwo=Remove(Ktwo,count2);col2=col2-1;elsecount2=count2+1;J_number=J_number+1;JC(J_number)=JC(J_number-1);end
end
%对聚类(三)中的样本进行修正[row3,col3]=size(Kthree);
count3=1;
while count3<=col3p(3,1)=kind1/(kind1+1)*(norm(number(Kthree(count3),2:5)-m(1,:))^2);p(3,2)=kind2/(kind2+1)*(norm(number(Kthree(count3),2:5)-m(2,:))^2);p(3,3)=kind3/(kind3-1)*(norm(number(Kthree(count3),2:5)-m(3,:))^2);[min_value,min_index]=min([p(3,1) p(3,2)]);if min_value<p(3,3)m(3,:)=m(3,:)+1/(kind3-1)*(m(3,:)-number(Kthree(count3),2:5)); if min_index==1m(1,:)=m(1,:)-1/(kind1+1)*(m(1,:)-number(Kthree(count3),2:5));kind1=kind1+1;Kone=Add(Kone,Kthree(count3));J_number=J_number+1;JC(J_number)=JC(J_number-1)-(p(3,3)-p(3,1));elsem(2,:)=m(2,:)-1/(kind2+1)*(m(2,:)-number(Kthree(count3),2:5));kind2=kind2+1;Ktwo=Add(Ktwo,Kthree(count3));J_number=J_number+1;JC(J_number)=JC(J_number-1)-(p(3,3)-p(3,2));endkind3=kind3-1;Kthree=Remove(Kthree,count3);col3=col3-1;elsecount3=count3+1;J_number=J_number+1;JC(J_number)=JC(J_number-1);end
end
end
%% 计算准确率
count=0;
count1=0;
count2=0;
count3=0;
[~,n]=size(Kone);
for i=1:nif Kone(i)<=50count1=count1+1; elseif Kone(i)>100count2=count2+1;elsecount3=count3+1;end
end
flag=[count1 count2 count3];
[a,b]=max(flag);
count=count+a;count1=0;
count2=0;
count3=0;
[~,n]=size(Ktwo);
for i=1:nif Ktwo(i)<=50count1=count1+1; elseif Ktwo(i)>100count2=count2+1;elsecount3=count3+1;end
end
flag=[count1 count2 count3];
[a,b]=max(flag);
count=count+a;count1=0;
count2=0;
count3=0;
[~,n]=size(Kthree);
for i=1:nif Kthree(i)<=50count1=count1+1; elseif Kthree(i)>100count2=count2+1;elsecount3=count3+1;end
end
flag=[count1 count2 count3];
[a,b]=max(flag);
count=count+a;
acc=count/150;
function [ Knumber_out ] = Add(Knumber,add_number)
%输入参数为聚类向量与需要添加的数
%输出为添加后的聚类向量
Knumber_out=[Knumber add_number];
end
function [Knumber_out] = Remove(Knumber,Kindex)
%输入为聚类向量与需要去除的聚类索引
%输出为去除后的聚类向量
[row,col]=size(Knumber);
Knumber_out=[Knumber(1:Kindex-1) Knumber(Kindex+1:col)];
end
function [J] = ERR(number,index,m)
%输入为数字样本,聚类样本的索引以及聚类中心
%输出为误差平方和
[row,n]=size(index);
J=0;
for i=1:nJ=J+norm(number(index(i),2:5)-m)^2;
end
end
C均值聚类算法及其实现相关推荐
- 聚类 python 代码_不足 20 行 Python 代码,高效实现 k-means 均值聚类算法
下载好向圈APP可以快速联系圈友 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 不足 20 行 Python 代码,高效实现 k-means 均值聚类算法-1.jpg (143.81 KB, ...
- 【模式识别】K均值聚类算法应用实验报告及MATLAB仿真
一. 实验目的 1.掌握K均值聚类算法的原理和实现过程: 2.掌握K均值聚类算法的应用方法. 二. 实验内容 1.彩色图像分割 选择一幅图像,分别按三种颜色数进行彩色图像分割的结果(原图和分割图).步 ...
- python kmeans聚类 对二维坐标点聚类_Kmeans均值聚类算法原理以及Python如何实现
第一步.随机生成质心 由于这是一个无监督学习的算法,因此我们首先在一个二维的坐标轴下随机给定一堆点,并随即给定两个质心,我们这个算法的目的就是将这一堆点根据它们自身的坐标特征分为两类,因此选取了两个质 ...
- k均值聚类算法优缺点_Grasshopper实现K均值聚类算法
本文很长很长,有很多很多图,包含以下部分: 1.算法简介 2.如何分类平面点 3.如何分类空间点 4.如何分类多维数据 5.后记 提醒:以下内容包括:智障操作,无中生友,重复造轮子 等 1.算法简介 ...
- K-means均值聚类算法的原理与实现
转自:http://blog.csdn.net/xiaolewennofollow/article/details/45541159 K-均值聚类算法的原理与实现 聚类是一种无监督的学习,它将相似的对 ...
- 不足 20 行 Python 代码,高效实现 k-means 均值聚类算法!
作者 | 许文武 责编 | 郭芮 出品 | CSDN 博客 scikti-learn 将机器学习分为4个领域,分别是分类(classification).聚类(clustering).回归(regre ...
- K-Means(K均值聚类算法)
K-Means(K均值聚类算法) 1.前言 要学习聚类算法就要知道聚类学习算法是什么,为什么要学习聚类学习聚类学习算法,有什么用途,下面就简单的做一下介绍,并且详细的说明k-means均值聚类学习算法 ...
- K均值聚类算法(HCM,K-Means)
K均值聚类核心思想如下: 算法把n个向量分为个组,并求每组的聚类中心,使得非相似性(或距离)指标的价值函数(或目标函数)达到最小.当选择欧几里德距离为组j中向量与相应聚类中心间的非相似性指标时,价值函 ...
- K均值聚类算法(Kmeans)讲解及源码实现
K均值聚类算法(Kmeans)讲解及源码实现 算法核心 K均值聚类的核心目标是将给定的数据集划分成K个簇,并给出每个数据对应的簇中心点.算法的具体步骤描述如下. 数据预处理,如归一化.离群点处理等. ...
- k均值聚类算法python_K均值和其他聚类算法:Python快速入门
k均值聚类算法python This post was originally published here 这篇文章最初发表在这里 Clustering is the grouping of obje ...
最新文章
- bnu 4067 美丽的花环
- 每日一练 20190523
- stylus之混合书写(Mixins)
- Android studio gradle task list 不显示问题
- Element中 el-tag 点击事件 el-tag添加@click事件无效
- 使用iText来生成PDF
- java8 构造函数引用_java8新特性之方法引用与构造器引用
- linux进入文件夹后退,实验二Linux系统简单文件操作命令
- BestCoder Round #90 Kblack loves flag
- 【Linux】复制文件到当前目录 / 复制文件并重命名到当前目录
- 惠普打印机墨盒更换教程_hp打印机墨盒怎么安装 hp打印机墨盒安装方法【详解】...
- Knowledge Distillation via Route Constrained Optimization
- 高清美图和GIF动图素材网站推荐,拿走不谢!
- 将一个自然数拆分为N个自然数
- Vue.js实现点击左右按钮图片切换
- 本地测试dubbo远程调用找不到provider
- R语言与LASSO回归和LAR算法
- 使用Burp抓包iphone(苹果)
- JS--数据类型--渡一教育(视频笔记)
- 盛大陈天桥:我从来没有离开,也从来没有后悔(转)
热门文章
- 移动互联网初创型团队需要什么样的云计算服务?
- 不要让Javascript的等价表格看上去那么难看
- PHRefreshTriggerView
- Web 爬虫 Apache Nutch 1.15 发布,支持 Java 10
- CodeWithMosh--mysql 学习笔记(2)
- 【机器人】9-10月项目疑惑
- WebStorm 2018.3.4破解方式
- java每轮排序结果,冒泡排序及其优化java
- python开发k8s管理平台_运维开发和k8s运维如何选择,请各位大神指导一下?
- [cs231n][Module 1: Neural Networks] Image Classification