机器学习算法(聚类算法)—K-Means算法

K-Means首先随机初始化k个聚类中心,通过迭代的方式不断调整聚类中心,知道k个聚类中心不再改变为之。在K-Means算法中,和K-近邻算法一样,这里的K的取值和相似性的度量都是很重要的。

一、聚类算法的简介

    聚类算法是一种典型的无监督学习算法,主要用于将相似的样本自动归到一个类别中。聚类算法与分类算法最大的区别是:聚类算法是无监督的学习算法,而分类算法属于监督的学习算法。

    在聚类算法中根据样本之间的相似性,将样本划分到不同的类别中,对于不同的相似度计算方法,会得到不同的聚类结果,常用的相似度计算方法有欧式距离法。

二、K-Means算法的概述

   基本K-Means算法的思想很简单,事先确定常数K,常数K意味着最终的聚类类别数,首先随机选定初始点为质心,并通过计算每一个样本与质心之间的相似度(这里为欧式距离),将样本点归到最相似的类中,接着,重新计算每个类的质心(即为类中心),重复这样的过程,知道质心不再改变,最终就确定了每个样本所属的类别以及每个类的质心。由于每次都要计算所有的样本与每一个质心之间的相似度,故在大规模的数据集上,K-Means算法的收敛速度比较慢。

三、K-Means算法的流程

  • 初始化常数K,随机选取初始点为质心
  • 重复计算一下过程,直到质心不再改变
    • 计算样本与每个质心之间的相似度,将样本归类到最相似的类中
    • 重新计算质心
  • 输出最终的质心以及每个类

四、K-Means算法的实现

    对数据集进行测试

原始数据集
MATLAB代码
主程序
  1. %% input the data  
  2. A = load('testSet.txt');  
  3.   
  4. %% 计算质心  
  5. centroids = kMeans(A, 4);  

随机选取质心
  1. %% 取得随机中心  
  2. function [ centroids ] = randCent( dataSet, k )  
  3.     [m,n] = size(dataSet);%取得列数  
  4.     centroids = zeros(k, n);  
  5.     for j = 1:n  
  6.         minJ = min(dataSet(:,j));  
  7.         rangeJ = max(dataSet(:,j))-min(dataSet(:,j));  
  8.         centroids(:,j) = minJ+rand(k,1)*rangeJ;%产生区间上的随机数  
  9.     end  
  10. end  

计算相似性
  1. function [ dist ] = distence( vecA, vecB )  
  2.     dist = (vecA-vecB)*(vecA-vecB)';%这里取欧式距离的平方  
  3. end  

kMeans的主程序
  1. %% kMeans的核心程序,不断迭代求解聚类中心  
  2. function [ centroids ] = kMeans( dataSet, k )  
  3.     [m,n] = size(dataSet);  
  4.     %初始化聚类中心  
  5.     centroids = randCent(dataSet, k);  
  6.     subCenter = zeros(m,2);%做一个m*2的矩阵,第一列存储类别,第二列存储距离  
  7.     change = 1;%判断是否改变  
  8.     while change == 1  
  9.         change = 0;  
  10.         %对每一组数据计算距离  
  11.         for i = 1:m  
  12.             minDist = inf;  
  13.             minIndex = 0;  
  14.             for j = 1:k  
  15.                  dist= distence(dataSet(i,:), centroids(j,:));  
  16.                  if dist < minDist  
  17.                      minDist = dist;  
  18.                      minIndex = j;  
  19.                  end  
  20.             end  
  21.             if subCenter(i,1) ~= minIndex  
  22.                 change = 1;  
  23.                 subCenter(i,:)=[minIndex, minDist];  
  24.             end          
  25.         end  
  26.         %对k类重新就算聚类中心  
  27.           
  28.         for j = 1:k  
  29.             sum = zeros(1,n);  
  30.             r = 0;%数量  
  31.             for i = 1:m  
  32.                 if subCenter(i,1) == j  
  33.                     sum = sum + dataSet(i,:);  
  34.                     r = r+1;  
  35.                 end  
  36.             end  
  37.             centroids(j,:) = sum./r;  
  38.         end  
  39.     end  
  40.       
  41.     %% 完成作图  
  42.     hold on  
  43.     for i = 1:m  
  44.         switch subCenter(i,1)  
  45.             case 1  
  46.                 plot(dataSet(i,1), dataSet(i,2), '.b');  
  47.             case 2  
  48.                 plot(dataSet(i,1), dataSet(i,2), '.g');  
  49.             case 3  
  50.                 plot(dataSet(i,1), dataSet(i,2), '.r');  
  51.             otherwise  
  52.                 plot(dataSet(i,1), dataSet(i,2), '.c');  
  53.         end  
  54.     end  
  55.     plot(centroids(:,1),centroids(:,2),'+k');  
  56. end  


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值