k-means(K均值)

1、无监督聚类算法

2、K---分成K类

3、分类准则:使得样本与各类中心之间的误差平方和最小

-------------------------------------------------------------

经典K-means算法步骤:

a.随机取K个种子点。
b、然后对图中的所有点求到这K个种子点的距离,假如点Pi离种子点Si最近,那么Pi属于Si点群。
c、接下来,我们要移动种子点到属于他的“点群”的中心。
d、然后重复第b)和第c)步,直到,种子点没有移动。

-------------------------------------------------------------

缺陷:1)最初的K值不好确定,不知道数据集,确切分成几类比较好【ISODATA算法通过类的自动合并和分裂,得到较为合理的类型数目K】

2)分类的效果好坏,与分类初始选择的种子点有很大的关系【K-Means++算法可以用来解决这个问题,其可以有效地选择初始点】

------------------------------------------------------------------

K-Means++算法步骤:

  1. 先从我们的数据库随机挑个随机点当“种子点”。
  2. 对于每个点,我们都计算其和最近的一个“种子点”的距离D(x)并保存在一个数组里,然后把这些距离加起来得到Sum(D(x))。
  3. 然后,再取一个随机值,用权重的方式来取计算下一个“种子点”。这个算法的实现是,先取一个能落在Sum(D(x))中的随机值Random,然后用Random -= D(x),直到其<=0,此时的点就是下一个“种子点”。
  4. 重复第(2)和第(3)步直到所有的K个种子点都被选出来。
  5. 进行K-Means算法。

可以看到算法的第三步选取新中心的方法,这样就能保证距离D(x)较大的点,会被选出来作为聚类中心了。至于为什么原因很简单,如下图 所示

假设A、B、C、D的D(x)如上图所示,当算法取值Sum(D(x))*random时,该值会以较大的概率落入D(x)较大的区间内,所以对应的点会以较大的概率被选中作为新的聚类中心。So it's work!

-----------------------------------------------------------------------

matlab代码:

function [centroids, labels] = run_kmeans(X, k, max_iter)
% 该函数实现Kmeans聚类
% 输入参数:
%                   X为输入样本集,dxN
%                   k为聚类中心个数
%                   max_iter为kemans聚类的最大迭代的次数
% 输出参数:
%                   centroids为聚类中心 dxk
%                   labels为样本的类别标记 %% 采用K-means++算法初始化聚类中心
centroids = X(:,1+round(rand*(size(X,2)-1)));
labels = ones(1,size(X,2));
for i = 2:k
D = X-centroids(:,labels);
D = cumsum(sqrt(dot(D,D,1)));
if D(end) == 0, centroids(:,i:k) = X(:,ones(1,k-i+1)); return; end
centroids(:,i) = X(:,find(rand < D/D(end),1));
[~,labels] = max(bsxfun(@minus,2*real(centroids'*X),dot(centroids,centroids,1).'));
end %% 标准Kmeans算法
for iter = 1:max_iter
for i = 1:k, l = labels==i; centroids(:,i) = sum(X(:,l),2)/sum(l); end
[~,labels] = max(bsxfun(@minus,2*real(centroids'*X),dot(centroids,centroids,1).'),[],1);
end end

  

参考资料:

1、http://blog.csdn.net/ac540101928/article/details/52484397

2、《视觉机器学习20讲》

1、K-means的更多相关文章

  1. 二次剩余、三次剩余、k次剩余

    今天研究了一下这块内容...首先是板子 #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  2. Java泛型 E、T、K、V、N

    中的标记符含义: E - Element (在集合中使用,因为集合中存放的是元素) T - Type(Java 类) K - Key(键) V - Value(值) N - Number(数值类型) ...

  3. Java泛型中E、T、K、V等的含义

     Java泛型中的标记符含义:  E - Element (在集合中使用,因为集合中存放的是元素) T - Type(Java 类) K - Key(键) V - Value(值) N - Numbe ...

  4. 机器学习 —— 基础整理(三)生成式模型的非参数方法: Parzen窗估计、k近邻估计;k近邻分类器

    本文简述了以下内容: (一)生成式模型的非参数方法 (二)Parzen窗估计 (三)k近邻估计 (四)k近邻分类器(k-nearest neighbor,kNN) (一)非参数方法(Non-param ...

  5. 机器学习算法( 二、K - 近邻算法)

    一.概述 k-近邻算法采用测量不同特征值之间的距离方法进行分类. 工作原理:首先有一个样本数据集合(训练样本集),并且样本数据集合中每条数据都存在标签(分类),即我们知道样本数据中每一条数据与所属分类 ...

  6. 12、K最近邻算法(KNN算法)

    一.如何创建推荐系统? 找到与用户相似的其他用户,然后把其他用户喜欢的东西推荐给用户.这就是K最近邻算法的分类作用. 二.抽取特征 推荐系统最重要的工作是:将用户的特征抽取出来并转化为度量的数字,然后 ...

  7. 2019 The Preliminary Contest for ICPC China Nanchang National Invitational(A 、H 、I 、K 、M)

    A. PERFECT NUMBER PROBLEM 题目链接:https://nanti.jisuanke.com/t/38220 题意: 输出前五个完美数 分析: 签到.直接百度完美数输出即可 #i ...

  8. 后端程序员之路 12、K最近邻(k-Nearest Neighbour,KNN)分类算法

    K最近邻(k-Nearest Neighbour,KNN)分类算法,是最简单的机器学习算法之一.由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重 ...

  9. bit、byte、k

    bit(位/比特位):一个二进制数据0/1 byte(字节):简称B:1byte=8bit:一个英文字符占用1byte,一个汉字占用2byte k:1K=1024B M:1M=1024K

  10. BotVS开发基础—2.1 账户、行情、K线、深度

    代码 import json def main(): Log("账号信息:", exchange.GetAccount()); # Log("K 线数据:", ...

随机推荐

  1. Windows 修改的hosts记录没有效果

    windows修改的hosts记录没有效果,新添加的也没有效果. 检查DNS设置相关的均正常, <Dns client为此计算机解析和缓冲域名系统 (DNS) 名称.> 为此计算机注册并更 ...

  2. snort学习笔记

    Snort有三种工作模式:嗅探器.数据包记录器.网络入侵检测系统(ids). 嗅探器模式仅仅是从网络上读取数据包并作为连续不断的流显示在终端上. 数据包记录器模式把数据包记录到硬盘上. 网络入侵检测模 ...

  3. UI设计教程分享:让你彻底读懂字体

    一份普普通通.规规矩矩的设计 一份让人印象深刻.新颖有趣的设计 差在哪?其实就差在三个字上! “优秀的设计不是每一个细节都有亮点,而是弱化其他元素,让某一个亮点最大化.” 今天“骉叔的设计心得”就来总 ...

  4. jQuery动画函数回调

    $("#show").click(function () { //function 是显示完成之后的回调函数 $("p").show(2000,function ...

  5. swift 总结

    结构体(struct)属于值类型, 当值类型的实例被声明为常量的时候,它的所有属性也就成了常量. 属于引用类型的类(class)则不一样.把一个引用类型的实例赋给一个常量后,仍然可以修改该实例的变量属 ...

  6. Python之路番外(第三篇):Pycharm的使用秘籍

    版本:Pycharm2017.3.4Professional Edition 一.Pycharm的基本使用1.在Pycharm下为你的python项目配置python解释器 file --settin ...

  7. Minimum Window Substring LT76

    Given a string S and a string T, find the minimum window in S which will contain all the characters ...

  8. 494. Target Sum - Unsolved

    https://leetcode.com/problems/target-sum/#/description You are given a list of non-negative integers ...

  9. python学习 day18 (3月25日)---( 面向对象浅析)

    面向对象思想: 字典表示对象: 不是太好 因为 变量 得一个个的赋值改值 {'name':'alex','blood':20,'attack':1,'sex':'不'} {'name':'太亮','b ...

  10. ubuntu新建、删除用户

    新建用户名为newuser的用户,并赋予sudo权限 adduser newuser --ingroup sudo 删除用户以及用户目录 deluser -r newuser