K-means算法及matlab代码

K-means算法(K-均值聚类算法)是著名的划分聚类分割方法。划分方法的基本思想是:给定一个有 N N N个元组或者记录的数据集,分裂法将构造 K K K个分组,每个分组就代表一个聚类, K < N K < N K<N,而且这 K K K个分组满足下列条件

  1. 每一个分组至少包含一个数据记录;

  2. 每一个数据记录属于且仅属于一个分组。

对于给定的 K K K,算法首先给出一个初始的分组方法,以后通过反复迭代的方法改变分组,使得每一次改进之后的分组方案都较前一次好。而所谓好的标准就是:同一分组中的记录越近越好(已经收敛,反复迭代至组内的数据几乎无差异),而不同分组中的记录越远越好。

K-means算法的工作原理:首先随机从数据集中选取 K K K个点,每一个点初始地代表每个簇的聚类中心,然后计算剩余各个样本到聚类中心的距离,将它赋给最近的簇,接着重新计算每一簇的平均值,整个过程不断重复,如果相邻两次调整没有明显变化,则说明数据聚类形成的簇已经收敛。本算法的一个特点是在每次迭代中都要考察每个样本的分类是否正确。若不正确,就要调整,在全部样本调整后,再修改聚类中心,进入下一次迭代。这个过程将不断重复直到满足某个终止条件,终止条件可以是以下任何一个

  1. 没有对象被重新分配给不同的聚类;

  2. 聚类中心再发生变化;

  3. 误差平方和局部最小。

K-means算法步骤

  1. n n n个数据对象中任意选择 k k k个对象作为初始聚类中心;

  2. 根据每个聚类对象的均值(中心对象),计算每个对象与这些中心对象的距离,并根据最小距离重新对相应的对象进行划分;

  3. 重新计算每个聚类的均值(中心对象),直到聚类中心不再变化。这种划分使得下式最小
    E = ∑ j = 1 k ∑ x i ∈ ω j ∣ ∣ x i − m j ∣ ∣ 2 E=\sum\limits_{j=1}^k\sum\limits_{x_i\in \omega_j}||x_i-m_j||^2 E=j=1kxiωj∣∣ximj2
    式中, x i x_i xi为第 i i i个样本点的位置; m j m_j mj为第 j j j个聚类中心的位置。

  4. 循环第(2)、(3)步,直到每个聚类不再发生变化为止。

K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。

K-means算法

输入:聚类个数 k k k,以及包含 n n n个数据对象的数据库。

输出:满足方差最小标准的 k k k个聚类。

处理流程:

  1. n n n个数据对象中任意选择 k k k个对象作为初始聚类中心;

  2. 根据每个聚类对象的均值(中心对象),计算每个对象与这些中心对象的距离,并根据最小距离重新对相应对象进行划分;

  3. 重新计算每个(有变化)聚类的均值(中心对象);

  4. 循环(2)、(3),直到每个聚类不再发生变化为止。

K-means算法接收输入量 k k k,然后将 n n n个数据对象划分为 k k k个聚类,以便使所获得的聚类满足:同一聚类中的对象相似度较高,而不同聚类中的对象相似度较小。。聚类相似度是利用各聚类中对象的均值获得一个“中心对象”(引力中心)来进行计算的。

K-means算法的特点:采用两阶段反复循环过程算法,结束的条件是不再有数据元素被重新分配。

data=[0.322892	0.004933952
0.103045	0.00289766
0.204495	0.001066036
0.381177	0.013181567
0.933527	0.010795936
0	0.026231849
0.13777198	0.030782945
0.52613076	0.00317064
0.37406807	0.007822776
0.960330367	0.03057774
0.95856485	0.004559961
0.641339714	0.044564845
0.460783419	0.004121574
1.051318243	0.017306114
0.848320793	0.01187206
	
3.230549	1.047587481
2.22566	0.861799255
2.124363	0.15689044
13.10467	1.028213274
5.570068	0.316292987
13.5113449	0.146318321
14.71199	0.338345426
5.220874	0.743775542
8.328532753	0.404637362
1.52465335	0.737265097
13.68321934	0.443603583
1.609899452	0.605704512
2.667960487	0.850171366
2.149666009	0.282812535
3.994502194	0.110862959
2.897157057	0.662742108
3.367146083	1.39391519
7.218858133	0.738538681
1.696503543	0.468011789
19.2326132	1.078379078
16.84265108	0.204680189
12.68081764	0.441123974
	
223.1852	1.418763587
163.2168	1.737665632
147.2274	1.173702954
145.8246	1.671726375
209.0202	1.273079421
173.6882	1.165418036
325.7335	1.735718709
379.9111	1.762369578
228.6430457	2.303190151
78.68303588	2.047547463
149.3716222	1.223168177
133.0602307	1.465836706
214.139865	2.218646664
275.157379	1.21190974
420.030504	1.28982856
63.0268581	0.868849667];
[idx,C] = kmeans(data,3);%这里k = 3
[hang, lie] = size(C); 
colo = ('rgbk'); %颜色属性,可以增加
sign = ('o*pd'); % 点标记属性,可以增加
figure
gscatter(data(:,1),data(:,2),idx,'rgbk')
hold on
for i = 1:hang
    plot(C(i,1),C(i,2),[colo(i),sign(i)],'MarkerSize',15)
end

你可能感兴趣的:(数学建模,算法,MATLAB,算法,kmeans,matlab)