kmeans理解

最近看到Andrew Ng的一篇论文,文中用到了Kmeans和DL结合的思想,突然发现自己对ML最基本的聚类算法都不清楚,于是着重的看了下Kmeans,并在网上找了程序跑了下。

kmeans是unsupervised learning最基本的一个聚类算法,我们可以用它来学习无标签的特征,其基本思想如下:

首先给出原始数据{x1,x2,...,xn},这些数据没有被标记的。

初始化k个随机数据u1,u2,...,uk,每一个ui都是一个聚类中心,k就是分为k类,这些xn和uk都是向量。

根据下面两个公式迭代就能求出最终所有的聚类中心u。

formula 1:

其中xi是第i个data,uj是第j(1~k)的聚类中心,这个公式的意思就是求出每一个data到k个聚类中心的距离,并求出最小距离,那么数据xi就可以归到这一类。

formula 2:

这个公式的目的是求出新的聚类中心,由于之前已经求出来每一个data到每一类的聚类中心uj,那么可以在每一类总求出其新的聚类中心(用这一类每一个data到中心的距离之和除以总的data),分别对k类同样的处理,这样我们就得到了k个新的聚类中心。

反复迭代公式一和公式二,知道聚类中心不怎么改变为止。

我们利用3维数据进行kmeans,代码如下:

run_means.m

   1: %%用来kmeans聚类的一个小代码
   2:  
   3: clear all;
   4: close all;
   5: clc;
   6:  
   7: %第一类数据
   8: mu1=[0 0 0];  %均值
   9: S1=[0.3 0 0;0 0.35 0;0 0 0.3];  %协方差
  10: data1=mvnrnd(mu1,S1,100);   %产生高斯分布数据
  11:  
  12: %%第二类数据
  13: mu2=[1.25 1.25 1.25];
  14: S2=[0.3 0 0;0 0.35 0;0 0 0.3];
  15: data2=mvnrnd(mu2,S2,100);
  16:  
  17: %第三个类数据
  18: mu3=[-1.25 1.25 -1.25];
  19: S3=[0.3 0 0;0 0.35 0;0 0 0.3];
  20: data3=mvnrnd(mu3,S3,100);
  21:  
  22: %显示数据
  23: plot3(data1(:,1),data1(:,2),data1(:,3),‘+‘);
  24: hold on;
  25: plot3(data2(:,1),data2(:,2),data2(:,3),‘r+‘);
  26: plot3(data3(:,1),data3(:,2),data3(:,3),‘g+‘);
  27: grid on;
  28:  
  29: %三类数据合成一个不带标号的数据类
  30: data=[data1;data2;data3];   %这里的data是不带标号的
  31:  
  32: %k-means聚类
  33: [u re]=KMeans(data,3);  %最后产生带标号的数据,标号在所有数据的最后,意思就是数据再加一维度
  34: [m n]=size(re);
  35:  
  36: %最后显示聚类后的数据
  37: figure;
  38: hold on;
  39: for i=1:m 
  40:     if re(i,4)==1   
  41:          plot3(re(i,1),re(i,2),re(i,3),‘ro‘); 
  42:     elseif re(i,4)==2
  43:          plot3(re(i,1),re(i,2),re(i,3),‘go‘); 
  44:     else 
  45:          plot3(re(i,1),re(i,2),re(i,3),‘bo‘); 
  46:     end
  47: end
  48: grid on;

KMeans.m

   1: %N是数据一共分多少类
   2: %data是输入的不带分类标号的数据
   3: %u是每一类的中心
   4: %re是返回的带分类标号的数据
   5: function [u re]=KMeans(data,N)   
   6:     [m n]=size(data);   %m是数据个数,n是数据维数
   7:     ma=zeros(n);        %每一维最大的数
   8:     mi=zeros(n);        %每一维最小的数
   9:     u=zeros(N,n);       %随机初始化,最终迭代到每一类的中心位置
  10:     for i=1:n
  11:        ma(i)=max(data(:,i));    %每一维最大的数
  12:        mi(i)=min(data(:,i));    %每一维最小的数
  13:        for j=1:N
  14:             u(j,i)=ma(i)+(mi(i)-ma(i))*rand();  %随机初始化,不过还是在每一维[min max]中初始化好些
  15:        end      
  16:     end
  17:    
  18:     while 1
  19:         pre_u=u;            %上一次求得的中心位置
  20:         for i=1:N
  21:             tmp{i}=[];      % 公式一中的x(i)-uj,为公式一实现做准备
  22:             for j=1:m
  23:                 tmp{i}=[tmp{i};data(j,:)-u(i,:)];
  24:             end
  25:         end
  26:         
  27:         quan=zeros(m,N);
  28:         for i=1:m        %公式一的实现
  29:             c=[];        %c 是到每类的距离
  30:             for j=1:N
  31:                 c=[c norm(tmp{j}(i,:))];
  32:             end
  33:             [junk index]=min(c);
  34:             quan(i,index)=norm(tmp{index}(i,:));           
  35:         end
  36:         
  37:         for i=1:N            %公式二的实现
  38:            for j=1:n
  39:                 u(i,j)=sum(quan(:,i).*data(:,j))/sum(quan(:,i));
  40:            end           
  41:         end
  42:         
  43:         if norm(pre_u-u)<0.1  %不断迭代直到位置不再变化
  44:             break;
  45:         end
  46:     end
  47:     
  48:     re=[];
  49:     for i=1:m
  50:         tmp=[];
  51:         for j=1:N
  52:             tmp=[tmp norm(data(i,:)-u(j,:))];
  53:         end
  54:         [junk index]=min(tmp);
  55:         re=[re;data(i,:) index];
  56:     end
  57:     
  58: end

原始数据如下所示,分为三类:

当k取2时,聚成2类:

当k取3时,聚成3类:

时间: 2024-10-30 21:41:21

kmeans理解的相关文章

[数据挖掘] - 聚类算法:K-means算法理解及SparkCore实现

聚类算法是机器学习中的一大重要算法,也是我们掌握机器学习的必须算法,下面对聚类算法中的K-means算法做一个简单的描述: 一.概述 K-means算法属于聚类算法中的直接聚类算法.给定一个对象(或记录)的集合,将这些对象划分为多个组或者“聚簇”,从而使同组内的对象间比较相似而不同组对象间差异比较大:换言之,聚类算法就是将相似的对象放到同一个聚簇中,而将不相似的对象放到不同的聚簇中.由于在聚类过程中不使用到类别标签,所以相似性的概念要基于对象的属性进行定义.应用不同则相似性规则和聚类算法一般不太

数据挖掘之KMeans算法应用与简单理解

一.背景 煤矿地磅产生了一系列数据: 我想从这些数据中,取出最能反映当前车辆重量的数据(有很多数据是车辆上磅过程中产生的数据).我于是想到了聚类算法KMeans,该算法思想比较简单. 二.算法步骤 1.从样本中随机取出k个值,作为初始中心 2.以k个中心划分这些数据,分为k个组 3.重新计算出每个组的中心,作为新中心 4.如果初始中心和新中心不相等,则把新中心作为初始中心,重复2,3.反之,结束 注意: 1.我没有用严格的算法定义,怕不好理解 2.KMeans善于处理球形数据,因此随机取k个质心

python-Kmeans\Kmeans++算法理解及代码实现

一.      环境: Python 3.7.4 Pycharm Community 2019.3 二.      问题:      对六个样本点[1, 5], [2, 4], [4, 1], [5, 0], [7, 6], [6, 7]进行K-means聚类. 三.      理论推导 此处依照我个人理解所写,错误之处欢迎指出 K-means核心操作为:聚类中心选取—分类—调整聚类中心—再次分类并调整聚类中心直到调整幅度小于阈值或程序运行轮数大于阈值 选取聚类中心: 聚类中心的选取可以选择随机

Cartesian k-means论文理解

1.普通k-means 给定n个p维数据点,D≡{Xj}nj=1,普通Kmeans算法将它们分成k个类别,每个类别有个类中心.目标函数是: 其中矩阵C的第i列是ci,分成m个类别,那么矩阵就有m列,b∈{0,1}k,且b 的模长为1,即b只有一个分量值为1,其余分量值为0. K-means算法之所以很难,其中一个原因是存在一个assignment过程,需要将数据集中每个点根据距离分配到离它最近的唯一的类中心所在的类别. 2.Orthogonal k-means with 2m centers 对

EM算法(1):K-means 算法

目录 EM算法(1):K-means 算法 EM算法(2):GMM训练算法 EM算法(3):EM算法详解 EM算法(1) : K-means算法 1. 简介 K-means算法是一类无监督的聚类算法,目的是将没有标签的数据分成若干个类,每一个类都是由相似的数据组成.这个类的个数一般是认为给定的. 2. 原理 假设给定一个数据集$\mathbf{X} = \{\mathbf{x}_1, \mathbf{x}_2,...,\mathbf{x}_N \}$, 和类的个数K.我们的每个类都用一个中心点$

Python—kmeans算法学习笔记

一.   什么是聚类 聚类简单的说就是要把一个文档集合根据文档的相似性把文档分成若干类,但是究竟分成多少类,这个要取决于文档集合里文档自身的性质.下面这个图就是一个简单的例子,我们可以把不同的文档聚合为3类.另外聚类是典型的无指导学习,所谓无指导学习是指不需要有人干预,无须人为文档进行标注. 二.聚类算法:from sklearn.cluster import KMeans def __init__(self, n_clusters=8, init='k-means++', n_init=10,

使用 Spark MLlib 做 K-means 聚类分析[转]

原文地址:https://www.ibm.com/developerworks/cn/opensource/os-cn-spark-practice4/ 引言 提起机器学习 (Machine Learning),相信很多计算机从业者都会对这个技术方向感到兴奋.然而学习并使用机器学习算法来处理数据却是一项复杂的工作,需要充足的知识储备,如概率论,数理统计,数值逼近,最优化理论等.机器学习旨在使计算机具有人类一样的学习能力和模仿能力,这也是实现人工智能的核心思想和方法.传统的机器学习算法,由于技术和

漫谈 Clustering (1): k-means

好久没有写 blog 了,一来是 blog 下线一段时间,而租 DreamHost 的事情又一直没弄好:二来是没有太多时间,天天都跑去实验室.现在主要折腾 Machine Learning 相关的东西,因为很多东西都不懂,所以平时也找一些资料来看.按照我以前的更新速度的话,这么长时间不写 blog 肯定是要被闷坏的,所以我也觉得还是不定期地整理一下自己了解到的东西,放在 blog 上,一来梳理总是有助于加深理解的,二来也算共享一下知识了.那么,还是从 clustering 说起吧. Cluste

斯坦福NG机器学习:K-means笔记

K-means 聚类算法: K-means聚类算法 算法流程,我们首先有训练集,但是训练集我们没有类标签,我们想把数据聚类成一些cluster ,这是一种无监督学习方法.具体步骤:1. 首先初始化cluster centroid 2. 迭代的找每一个数据集点到最近cluster centroid,然后把该点给到最近cluster centroid所在的cluster,然后在更新cluster centroid 直到算法收敛. 算法也可如下图描述:分为两部分cluster assignment 和