K-Means聚类算法-模式识别_第1页
K-Means聚类算法-模式识别_第2页
K-Means聚类算法-模式识别_第3页
K-Means聚类算法-模式识别_第4页
K-Means聚类算法-模式识别_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、-作者xxxx-日期xxxxK-Means聚类算法-模式识别【精品文档】K-Means聚类算法1. 算法原理k-means是划分方法中较经典的聚类算法之一。由于该算法的效率高,所以在对大规模数据进行聚类时被广泛应用。目前,许多算法均围绕着该算法进行扩展和改进。k-means算法以k为参数,把n个对象分成k个簇,使簇内具有较高的相似度,而簇间的相似度较低。k-means算法的处理过程如下:首先,随机地选择k个对象,每个对象初始地代表了一个簇的平均值或中心;对剩余的每个对象,根据其与各簇中心的距离,将它赋给最近的簇;然后重新计算每个簇的平均值。这个过程不断重复,直到准则函数收敛。通常,采用平方误差

2、准则,其定义如下:这里E是数据库中所有对象的平方误差的总和,p是空间中的点,mi是簇Ci的平均值。该目标函数使生成的簇尽可能紧凑独立,使用的距离度量是欧几里得距离,当然也可以用其他距离度量。k-means聚类算法的算法流程如下: 输入:包含n个对象的数据库和簇的数目k; 输出:k个簇,使平方误差准则最小。 步骤:(1) 任意选择k个对象作为初始的簇中心;(2) repeat;(3) 根据簇中对象的平均值,将每个对象(重新)赋予最类似的簇;(4) 更新簇的平均值,即计算每个簇中对象的平均值;(5) 直到不再发生变化。2. 主要代码主程序:clc;clear;close all; % 聚类算法测试

3、nSample = 500, 500, 500; % 3维情况dim = 3;coeff = -2 0.8; -1 0.9; 2 0.7;, . 1 0.9; -2 0.7; -2 0.8; , . -2 0.7; 2 0.8; -1 0.9; , ; data = createSample(nSample, dim , coeff); % 得到训练数据nClass = length(nSample); tlabel = ;tdata = ; for i = 1 : nClass tlabel = tlabel; i * ones(nSample(i), 1); tdata = tdata;

4、datai;end % 调用k-means聚类算法 label = stpKMeans( tdata, nClass); % 绘图result = cell(1, nClass);index = 0;for i = 1 : nClass index = find(label(:,1) = i); resulti = tdata(index, :);end figure;subplot(1, 2, 1);plot3(data1(:, 1), data1(:, 2), data1(:, 3), *, . data2(:, 1), data2(:, 2), data2(:, 3), o, . dat

5、a3(:, 1), data3(:, 2), data3(:, 3), x);title(初始数据); subplot(1, 2, 2);plot3(result1(:, 1), result1(:, 2), result1(:, 3), *, . result2(:, 1), result2(:, 2), result2(:, 3), o, . result3(:, 1), result3(:, 2), result3(:, 3), x);title(K-Means聚类结果); K-Means核心算法:function label = stpKMeans( data, k)% KMeans

6、聚类算法,参考% % 输入% data 原始数据% k 聚多少个簇% 输出% label 按照data数据的顺序,每个样本的簇号的列表 n, dim = size(data); label = zeros(n, 1); % 任选k个对象作为初始的簇中心 seq = stpRandN_K(n, k); nowMeans = data(seq, :); for i = 1 : k label(seq(i) = i; end dist = zeros(n, k); while(true) % 计算数据到每个簇的欧几里得距离 for i = 1 : k temp = data; for j = 1 :

7、 dim % 先让数据减去第j个特征 temp(:, j) = data(:, j) - nowMeans(i, j); end % 点乘后再相加球的距离的平方 temp = temp .* temp; dist(:, i) = sum(temp, 2); end % 从k种距离中找出最小的,并计算修改次数(label跟上一次不一样) , label2 = min(dist, , 2); editElem = sum(label(:, 1) = label2(:, 1); label = label2; % for i = 1 : n% % 根据均值将当前的每个元素重新分簇% minDist

8、= inf;% index = -1;% % 从当前的k个均值中找到离元素i最近的一个,将其划分到该簇% for j = 1 : k% dist = data(i,:) - nowMeans(j, :);% dist = dot(dist, dist);% % if(dist minDist)% % 修改最近的距离,并记录测试的簇号% minDist = dist;% index = j;% end% end% % % 判断是该元素是否重新划分了簇% if(index = label(i) )% editElem = editElem + 1;% label(i) = index;% end%

9、 % end if editElem = 0 % 表示本次没有修改,那么跳出循环 break; end % 重新分簇后,重新计算均值 for i = 1 : k % 计算第k簇的均值 index = find(label(:, 1) = i ); nowMeans(i, :) = mean(data(index, :); end endend 从n个元素中随机抽取K个元素的代码:function out = stpRandN_K(n, k)% 从1-n中随机选中k个不同的元素 data = 1 : n; for i = 1 : k index = floor( (n-i+1)*rand() )

10、 + i; % 交换i和index上的数据 temp = data(index); data(index) = data(i); data(i) = temp; end out = data(1:k);end图片聚类测试代码:close all;clc;clear; rgbdata = imread(datag-1.jpg);labdata = stpRgb2Lab(rgbdata); sm, sn, = size(labdata); sN = sm * sn; nClass = 4;labdata = reshape(labdata, sN, 3); label = stpKMeans( l

11、abdata, nClass);label = reshape(label, sm, sn);figure;subplot(1, 2, 1);imshow(rgbdata);hold on; subplot(1, 2, 2); TX = 1 : sn;TY = 1 : sm;imagesc(TX, TY, label);3. 结果分析针对给定的参数K-Means算法三类聚类结果:图1 初始数据和K-Means聚类结果当初始数据给为如下时:K-Means算法三类聚类结果:图2 初始数据和K-Means聚类结果由此可以看到,K-Means算法会把一些偏离中心较远的点分到其它簇内。4. 用于图片的结果以

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论