k-means算法_k-means算法c++ - CSDN
k-means算法 订阅
k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是,预将数据分为K组,则随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。 展开全文
k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是,预将数据分为K组,则随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。
信息
提出时间
1967年
提出者
James MacQueen
类    型
聚类算法
中文名
K均值聚类算法
应    用
数据分析,信号处理,机器学习
外文名
k-means clustering algorithm
K均值聚类算法定义
聚类是一个将数据集中在某些方面相似的数据成员进行分类组织的过程,聚类就是一种发现这种内在结构的技术,聚类技术经常被称为无监督学习。k均值聚类是最著名的划分聚类算法,由于简洁和效率使得他成为所有聚类算法中最广泛使用的。给定一个数据点集合和需要的聚类数目k,k由用户指定,k均值算法根据某个距离函数反复把数据分入k个聚类中。
收起全文
精华内容
参与话题
  • K-means聚类算法

    千次阅读 2015-04-02 14:47:56
    K-means也是聚类算法中最简单的一种了,但是里面包含的思想却是不一般。Andrew Ng的这个讲义里很清晰地讲解了K-means后面包含的EM思想。   本文首先介绍聚类的基础——距离与相异度,然后介绍一种常见的聚类算法...


     本文首先介绍聚类的基础——距离与相异度,然后介绍一种常见的聚类算法——k均值和k中心点聚类,最后会举一个实例:以MATLAB代码实现k均值聚类算法。

       一、分类与聚类的区别:                                                                                                                                                                     

         分类作为一种监督学习方法,要求必须事先明确知道各个类别的信息,并且断言所有待分类项都有一个类别与之对应。但是很多时候上述条件得不到满足,尤其是在处理海量数据的时候,如果通过预处理使得数据满足分类算法的要求,则代价非常大,这时候可以考虑使用聚类算法。聚类属于无监督学习,相比于分类,聚类不依赖预定义的类和类标号的训练实例。分类算法是给一个数据,然后判断这个数据属于已分好的类中的具体哪一类。聚类算法是给一大堆原始数据,然后通过算法将其中具有相似特征的数据聚为一类。以往的回归、朴素贝叶斯、SVM等都是有类别标签y的,也就是说样例中已经给出了样例的分类。而聚类的样本中却没有给定y,只有特征x,比如假设宇宙中的星星可以表示成三维空间中的点集clip_image002[10]。聚类的目的是找到每个样本x潜在的类别y,并将同类别y的样本x放在一起。

    二、距离与相异度                                                                                                                                                     

          讨论聚类前,我们要先弄清楚一个问题:如何定量计算两个可比较元素间的相异度。用通俗的话说,相异度就是两个东西差别有多大,例如人类与章鱼的相异度明显大于人类与黑猩猩的相异度,这是能我们直观感受到的。但是,计算机没有这种直观感受能力,我们必须对相异度在数学上进行定量定义。在做分类时常常需要估算不同样本之间的相似性度量(SimilarityMeasurement),这时通常采用的方法就是计算样本间的“距离”(Distance)。采用什么样的方法计算距离是很讲究,甚至关系到分类的正确与否。

          ,其中X,Y是两个元素项,各自具有n个可度量特征属性,那么X和Y的相异度定义为:,其中R为实数域。也就是说相异度是两个元素对实数域的一个映射,所映射的实数定量表示两个元素的相异度。

          下面介绍不同类型变量相异度计算方法。

    1.欧氏距离

    2.曼哈顿距离

    3. 切比雪夫距离

    4. 闵可夫斯基距离

    5.标准化欧氏距离

    6.马氏距离

    7.夹角余弦

    8.汉明距离

    9.杰卡德距离& 杰卡德相似系数

    10.相关系数& 相关距离

    11.信息熵

    1. 欧氏距离(EuclideanDistance)

           欧氏距离是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式。

    (1)二维平面上两点a(x1,y1)与b(x2,y2)间的欧氏距离:

     

    (2)三维空间两点a(x1,y1,z1)与b(x2,y2,z2)间的欧氏距离:

     

    (3)两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的欧氏距离:

     

      也可以用表示成向量运算的形式:

     

    (4)Matlab计算欧氏距离

    Matlab计算距离主要使用pdist函数。若X是一个M×N的矩阵,则pdist(X)将X矩阵M行的每一行作为一个N维向量,然后计算这M个向量两两间的距离。

    例子:计算向量(0,0)、(1,0)、(0,2)两两间的欧式距离

    X= [0 0 ; 1 0 ; 0 2]

    D= pdist(X,'euclidean')

    结果:

    D=

        1.0000   2.0000    2.2361

     


    2. 曼哈顿距离(ManhattanDistance)

           从名字就可以猜出这种距离的计算方法了。想象你在曼哈顿要从一个十字路口开车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。实际驾驶距离就是这个“曼哈顿距离”。而这也是曼哈顿距离名称的来源, 曼哈顿距离也称为城市街区距离(CityBlock distance)

    (1)二维平面两点a(x1,y1)与b(x2,y2)间的曼哈顿距离

     

    (2)两个n维向量a(x11,x12,…,x1n)与b(x21,x22,…,x2n)间的曼哈顿距离

     

    (3)Matlab计算曼哈顿距离

    例子:计算向量(0,0)、(1,0)、(0,2)两两间的曼哈顿距离

    X= [0 0 ; 1 0 ; 0 2]

    D= pdist(X, 'cityblock')

    结果:

    D=

         1    2     3


    3. 切比雪夫距离 ( Chebyshev Distance )

           国际象棋玩过么?国王走一步能够移动到相邻的8个方格中的任意一个。那么国王从格子(x1,y1)走到格子(x2,y2)最少需要多少步?自己走走试试。你会发现最少步数总是max(| x2-x1 | , | y2-y1 | ) 步。有一种类似的一种距离度量方法叫切比雪夫距离。

    (1)二维平面两点a(x1,y1)与b(x2,y2)间的切比雪夫距离

     

    (2)两个n维向量a(x11,x12,…,x1n)与b(x21,x22,…,x2n)间的切比雪夫距离

     

      这个公式的另一种等价形式是

     

           看不出两个公式是等价的?提示一下:试试用放缩法和夹逼法则来证明。

    (3)Matlab计算切比雪夫距离

    例子:计算向量(0,0)、(1,0)、(0,2)两两间的切比雪夫距离

    X= [0 0 ; 1 0 ; 0 2]

    D= pdist(X, 'chebychev')

    结果:

    D=

         1    2     2

     


    4. 闵可夫斯基距离(MinkowskiDistance)

    闵氏距离不是一种距离,而是一组距离的定义。

    (1)闵氏距离的定义

           两个n维变量a(x11,x12,…,x1n)与b(x21,x22,…,x2n)间的闵可夫斯基距离定义为:

     

    其中p是一个变参数。

    当p=1时,就是曼哈顿距离

    当p=2时,就是欧氏距离

    当p→∞时,就是切比雪夫距离

           根据变参数的不同,闵氏距离可以表示一类的距离。

    (2)闵氏距离的缺点

      闵氏距离,包括曼哈顿距离、欧氏距离和切比雪夫距离都存在明显的缺点。

      举个例子:二维样本(身高,体重),其中身高范围是150~190,体重范围是50~60,有三个样本:a(180,50),b(190,50),c(180,60)。那么a与b之间的闵氏距离(无论是曼哈顿距离、欧氏距离或切比雪夫距离)等于a与c之间的闵氏距离,但是身高的10cm真的等价于体重的10kg么?因此用闵氏距离来衡量这些样本间的相似度很有问题。

           简单说来,闵氏距离的缺点主要有两个:(1)将各个分量的量纲(scale),也就是“单位”当作相同的看待了。(2)没有考虑各个分量的分布(期望,方差等)可能是不同的。

    (3)Matlab计算闵氏距离

    例子:计算向量(0,0)、(1,0)、(0,2)两两间的闵氏距离(以变参数为2的欧氏距离为例)

    X= [0 0 ; 1 0 ; 0 2]

    D= pdist(X,'minkowski',2)

    结果:

    D=

        1.0000   2.0000    2.2361



    5. 标准化欧氏距离(Standardized Euclidean distance )

    (1)标准欧氏距离的定义

      标准化欧氏距离是针对简单欧氏距离的缺点而作的一种改进方案。标准欧氏距离的思路:既然数据各维分量的分布不一样,好吧!那我先将各个分量都“标准化”到均值、方差相等吧。均值和方差标准化到多少呢?这里先复习点统计学知识吧,假设样本集X的均值(mean)为m,标准差(standarddeviation)为s,那么X的“标准化变量”表示为:

      而且标准化变量的数学期望为0,方差为1。因此样本集的标准化过程(standardization)用公式描述就是:

      标准化后的值 =  ( 标准化前的值  - 分量的均值 ) /分量的标准差

      经过简单的推导就可以得到两个n维向量a(x11,x12,…,x1n)与b(x21,x22,…,x2n)间的标准化欧氏距离的公式:

      如果将方差的倒数看成是一个权重,这个公式可以看成是一种加权欧氏距离(WeightedEuclidean distance)

    (2)Matlab计算标准化欧氏距离

    例子:计算向量(0,0)、(1,0)、(0,2)两两间的标准化欧氏距离 (假设两个分量的标准差分别为0.5和1)

    X= [0 0 ; 1 0 ; 0 2]

    D= pdist(X, 'seuclidean',[0.5,1])

    结果:

    D=

        2.0000   2.0000    2.8284

     


    6. 马氏距离(MahalanobisDistance)

    (1)马氏距离定义

           有M个样本向量X1~Xm,协方差矩阵记为S,均值记为向量μ,则其中样本向量X到u的马氏距离表示为:

     

           而其中向量Xi与Xj之间的马氏距离定义为:

           若协方差矩阵是单位矩阵(各个样本向量之间独立同分布),则公式就成了:

           也就是欧氏距离了。

      若协方差矩阵是对角矩阵,公式变成了标准化欧氏距离。

    (2)马氏距离的优缺点:量纲无关,排除变量之间的相关性的干扰。

    (3)Matlab计算(1 2),( 1 3),( 2 2),( 3 1)两两之间的马氏距离

    X = [1 2; 1 3; 2 2; 3 1]

    Y = pdist(X,'mahalanobis')

     

    结果:

    Y=

        2.3452   2.0000    2.3452    1.2247   2.4495    1.2247

     


    7. 夹角余弦(Cosine)

           有没有搞错,又不是学几何,怎么扯到夹角余弦了?各位看官稍安勿躁。几何中夹角余弦可用来衡量两个向量方向的差异,机器学习中借用这一概念来衡量样本向量之间的差异。

    (1)在二维空间中向量A(x1,y1)与向量B(x2,y2)的夹角余弦公式:

    (2)两个n维样本点a(x11,x12,…,x1n)和b(x21,x22,…,x2n)的夹角余弦

           类似的,对于两个n维样本点a(x11,x12,…,x1n)和b(x21,x22,…,x2n),可以使用类似于夹角余弦的概念来衡量它们间的相似程度。

      即:

           夹角余弦取值范围为[-1,1]。夹角余弦越大表示两个向量的夹角越小,夹角余弦越小表示两向量的夹角越大。当两个向量的方向重合时夹角余弦取最大值1,当两个向量的方向完全相反夹角余弦取最小值-1。

           夹角余弦的具体应用可以参阅参考文献[1]。

    (3)Matlab计算夹角余弦

    例子:计算(1,0)、( 1,1.732)、(-1,0)两两间的夹角余弦

    X= [1 0 ; 1 1.732 ; -1 0]

    D= 1- pdist(X, 'cosine')  % Matlab中的pdist(X,'cosine')得到的是1减夹角余弦的值

    结果:

    D=

        0.5000  -1.0000   -0.5000

     


    8. 汉明距离(Hammingdistance)

    (1)汉明距离的定义

           两个等长字符串s1与s2之间的汉明距离定义为将其中一个变为另外一个所需要作的最小替换次数。例如字符串“1111”与“1001”之间的汉明距离为2。

           应用:信息编码(为了增强容错性,应使得编码间的最小汉明距离尽可能大)。

    (2)Matlab计算汉明距离

      Matlab中2个向量之间的汉明距离的定义为2个向量不同的分量所占的百分比。

           例子:计算向量(0,0)、(1,0)、(0,2)两两间的汉明距离

    X = [0 0 ; 1 0 ; 0 2];

    D = PDIST(X, 'hamming')

    结果:

    D=

        0.5000   0.5000    1.0000

     


    9. 杰卡德相似系数(Jaccardsimilarity coefficient)

    (1) 杰卡德相似系数

           两个集合A和B的交集元素在A,B的并集中所占的比例,称为两个集合的杰卡德相似系数,用符号J(A,B)表示。

      杰卡德相似系数是衡量两个集合的相似度一种指标。

    (2) 杰卡德距离

           与杰卡德相似系数相反的概念是杰卡德距离(Jaccarddistance)。杰卡德距离可用如下公式表示:

      杰卡德距离用两个集合中不同元素占所有元素的比例来衡量两个集合的区分度。

    (3)杰卡德相似系数与杰卡德距离的应用

           可将杰卡德相似系数用在衡量样本的相似度上。

      样本A与样本B是两个n维向量,而且所有维度的取值都是0或1。例如:A(0111)和B(1011)。我们将样本看成是一个集合,1表示集合包含该元素,0表示集合不包含该元素。

    p:样本A与B都是1的维度的个数

    q:样本A是1,样本B是0的维度的个数

    r:样本A是0,样本B是1的维度的个数

    s:样本A与B都是0的维度的个数


    那么样本A与B的杰卡德相似系数可以表示为:

    这里p+q+r可理解为A与B的并集的元素个数,而p是A与B的交集的元素个数。

    而样本A与B的杰卡德距离表示为:

    (4)Matlab计算杰卡德距离

    Matlab的pdist函数定义的杰卡德距离跟我这里的定义有一些差别,Matlab中将其定义为不同的维度的个数占“非全零维度”的比例。

    例子:计算(1,1,0)、(1,-1,0)、(-1,1,0)两两之间的杰卡德距离

    X= [1 1 0; 1 -1 0; -1 1 0]

    D= pdist( X , 'jaccard')

    结果

    D=

    0.5000    0.5000   1.0000

     


    10. 相关系数( Correlation coefficient )与相关距离(Correlation distance)

    (1)相关系数的定义

    相关系数是衡量随机变量X与Y相关程度的一种方法,相关系数的取值范围是[-1,1]。相关系数的绝对值越大,则表明X与Y相关度越高。当X与Y线性相关时,相关系数取值为1(正线性相关)或-1(负线性相关)。

    (2)相关距离的定义

     

    (3)Matlab计算(1, 2 ,3 ,4 )与( 3 ,8 ,7 ,6 )之间的相关系数与相关距离

    X = [1 2 3 4 ; 3 8 7 6]

    C = corrcoef( X' )   %将返回相关系数矩阵

    D = pdist( X , 'correlation')

    结果:

    C=

        1.0000   0.4781

        0.4781   1.0000

    D=

    0.5219

          其中0.4781就是相关系数,0.5219是相关距离。


    11. 信息熵(Information Entropy)

           信息熵并不属于一种相似性度量。那为什么放在这篇文章中啊?这个。。。我也不知道。 (╯▽╰)

    信息熵是衡量分布的混乱程度或分散程度的一种度量。分布越分散(或者说分布越平均),信息熵就越大。分布越有序(或者说分布越集中),信息熵就越小。

           计算给定的样本集X的信息熵的公式:

    参数的含义:

    n:样本集X的分类数

    pi:X中第i类元素出现的概率

           信息熵越大表明样本集S分类越分散,信息熵越小则表明样本集X分类越集中。。当S中n个分类出现的概率一样大时(都是1/n),信息熵取最大值log2(n)。当X只有一个分类时,信息熵取最小值0

    三、K-means算法                                                                                                                                                                                        

    在聚类问题中,给我们的训练样本是clip_image004,每个clip_image006,没有了y。

         K-means算法是将样本聚类成k个簇(cluster),具体算法描述如下:

    1、 随机选取k个聚类质心点(cluster centroids)为clip_image008[6]

    2、 重复下面过程直到收敛 {

                   对于每一个样例i,计算其应该属于的类(意思就是求出所有数据和初始化的随机数据的距离,然后找出距离每个初始数据最近的数据。

                   clip_image009(公式一)

                   对于每一个类j,重新计算该类的质心(意思就是求出所有和这个初始数据最近原始数据的距离的均值。

                   clip_image010[6](公式二)

    }


    然后不断迭代两个公式,直到所有的u都不怎么变化了,就算完成了。

    K是我们事先给定的聚类数,clip_image012[6]代表样例i与k个类中距离最近的那个类,clip_image012[7]的值是1到k中的一个。质心clip_image014[6]代表我们对属于同一个类的样本中心点的猜测,拿星团模型来解释就是要将所有的星星聚成k个星团,首先随机选取k个宇宙中的点(或者k个星星)作为k个星团的质心,然后第一步对于每一个星星计算其到k个质心中每一个的距离,然后选取距离最近的那个星团作为clip_image012[8],这样经过第一步每一个星星都有了所属的星团;第二步对于每一个星团,重新计算它的质心clip_image014[7](对里面所有的星星坐标求平均)。重复迭代第一步和第二步直到质心不变或者变化很小。

    四、K-means算法的MATLAB实现

    下面是Matlab代码,这里我把测试数据改为了三维了,函数是可以处理各种维度的。参见:matlab练习程序(k-means聚类)

    main.m

    clear all;
    close all;
    clc;
    
    %第一类数据
    mu1=[0 0 0];  %均值
    S1=[0.3 0 0;0 0.35 0;0 0 0.3];  %协方差
    data1=mvnrnd(mu1,S1,100);   %产生高斯分布数据
    
    %%第二类数据
    mu2=[1.25 1.25 1.25];
    S2=[0.3 0 0;0 0.35 0;0 0 0.3];
    data2=mvnrnd(mu2,S2,100);
    
    %第三个类数据
    mu3=[-1.25 1.25 -1.25];
    S3=[0.3 0 0;0 0.35 0;0 0 0.3];
    data3=mvnrnd(mu3,S3,100);
    
    %显示数据
    plot3(data1(:,1),data1(:,2),data1(:,3),'+');
    hold on;
    plot3(data2(:,1),data2(:,2),data2(:,3),'r+');
    plot3(data3(:,1),data3(:,2),data3(:,3),'g+');
    grid on;
    
    %三类数据合成一个不带标号的数据类
    data=[data1;data2;data3];   %这里的data是不带标号的
    
    %k-means聚类
    [u re]=KMeans(data,3);  %最后产生带标号的数据,标号在所有数据的最后,意思就是数据再加一维度
    [m n]=size(re);
    
    %最后显示聚类后的数据
    figure;
    hold on;
    for i=1:m 
        if re(i,4)==1   
             plot3(re(i,1),re(i,2),re(i,3),'ro'); 
        elseif re(i,4)==2
             plot3(re(i,1),re(i,2),re(i,3),'go'); 
        else 
             plot3(re(i,1),re(i,2),re(i,3),'bo'); 
        end
    end
    grid on;

    kMeans.m

    %N是数据一共分多少类
    %data是输入的不带分类标号的数据
    %u是每一类的中心
    %re是返回的带分类标号的数据
    function [u re]=KMeans(data,N)   
        [m n]=size(data);   %m是数据个数,n是数据维数
        ma=zeros(n);        %每一维最大的数
        mi=zeros(n);        %每一维最小的数
        u=zeros(N,n);       %随机初始化,最终迭代到每一类的中心位置
        for i=1:n
           ma(i)=max(data(:,i));    %每一维最大的数
           mi(i)=min(data(:,i));    %每一维最小的数
           for j=1:N
                u(j,i)=ma(i)+(mi(i)-ma(i))*rand();  %随机初始化,不过还是在每一维[min max]中初始化好些
           end      
        end
       
        while 1
            pre_u=u;            %上一次求得的中心位置
            for i=1:N
                tmp{i}=[];      % 公式一中的x(i)-uj,为公式一实现做准备
                for j=1:m
                    tmp{i}=[tmp{i};data(j,:)-u(i,:)];
                end
            end
            
            quan=zeros(m,N);
            for i=1:m        %公式一的实现
                c=[];
                for j=1:N
                    c=[c norm(tmp{j}(i,:))];
                end
                [junk index]=min(c);
                quan(i,index)=norm(tmp{index}(i,:));           
            end
            
            for i=1:N            %公式二的实现
               for j=1:n
                    u(i,j)=sum(quan(:,i).*data(:,j))/sum(quan(:,i));
               end           
            end
            
            if norm(pre_u-u)<0.1  %不断迭代直到位置不再变化
                break;
            end
        end
        
        re=[];
        for i=1:m
            tmp=[];
            for j=1:N
                tmp=[tmp norm(data(i,:)-u(j,:))];
            end
            [junk index]=min(tmp);
            re=[re;data(i,:) index];
        end
        
    end

    结果图如下:

    用三个三维高斯分布数据画出的图:


    通过对没有标记的原始数据进行kmeans聚类得到的分类:












          


    展开全文
  • K-means 算法【基本概念篇】

    千次阅读 多人点赞 2019-07-27 21:58:09
    k-means 算法是一个聚类的算法 也就是clustering 算法。是属于无监督学习算法,也是就样本没有label(标签)的算分,然后根据某种规则进行“分割”, 把相同的或者相近的objects 物体放在一起。 在这里K就是我们想要...

    写在前面的话

    k-means 算法是一个聚类的算法 也就是clustering 算法。是属于无监督学习算法,也是就样本没有label(标签)的算分,然后根据某种规则进行“分割”, 把相同的或者相近的objects 物体放在一起。

    在这里K就是我们想要分割的的聚类的个数。

    当然了,很多资料都会说这个算法吧,毕竟简单粗暴可依赖

    算法描述

    首先我们有以下的几个点

    A1 (2,10)
    A2 (2,5)
    A3 (8,4)
    A4 (5,8)
    A5 (7,5)
    A6 (6,4)
    A7 (1,2)
    A8 (4,9)

    这个算法不能帮助我们自动分类,所以我们需要指定我们需要的个数。其实在很多实际应用当中,我们很难知道我们的数据是什么分布的,应该分成几类比较好。这也是k-means自身的一个缺陷,所以不能帮助我们自动的聚类。

    注:如果我在本文中说了分类,其实是分割的意思,我想表达的意思是聚类。
    中文和英文切换,在意思上表达真的有点差距。

    现在假设我们需要把上面的数据点分成三类。我们需要遵循下面的几个步骤

    1. 选取三个类的初始中心
    2. 计算剩余点到这三个中心的距离
    3. 将距离中心点距离最短的点归为一类
    4. 依次划分好所有的数据点
    5. 重新计算中心
    6. 重复2-5 个步骤,直到中心点不会在变化为止

    现在看完步骤,其实可能会有一些疑问:
    1. 怎么选择我们的初始中心点?
    2. 怎么计算点之间的距离呢。

    选择中心点

    中心点怎么选择,一般情况下我们是随机的从我们的数据集中选择的。当然还会有其他的方法,我们在之后的文章中可能会讨论。如果我还有时间去写的话,一般我会有时间写的。

    甚至这个中心点的选择可以是完全随机的,甚至都不需要从我们的数据集中选取,在这里,我们的数据集是一个二维的,所以我们可以选择在XY坐标上的任意三个点,随你高兴都是可以的

    注意:中心点的选取不同,最后的聚类结果可能大不相同

    在这里我们假设我们的三个初始点是A,
    在这里我们选取的初始点是A1,A4,A7

    在这里我们定义两个点之间的距离用曼哈顿聚类距离,也可以叫做城市街区距离。
    在这里插入图片描述

    在这里我们是二维坐标,所以我们可以按照下面这个公式:
    在这里插入图片描述

    下面是一个例子:
    在这里插入图片描述

    计算的一般过程:

    我们先看第一轮:

    在这里插入图片描述
    选取距离最近的归为一类
    这个时候我们得到的聚类的结果:
    在这里插入图片描述

    得到了第一轮的结果我们需要重新的计算每个聚类的中心

    cluster1
    对于第一个聚类只有一个点所以它的聚类的中心就是它自己。

    Cluster2
    X:
    (8+5+7+6+4)/5 = 6
    Y:
    (4+8+5+4+9)/5 = 6

    这个时候它的中心就变成了(6,6)

    Cluster3:
    X:
    (2+1)/2 = 1.5
    Y:
    (5+2)/2 = 3.5

    这个时候在进行第二轮迭代:
    在这里插入图片描述

    这个时候再次计算中心:

    在这里插入图片描述

    这个时候用我们的新的中心再来计算一遍:

    在这里插入图片描述

    这个时候我们在重新根据新的聚类重新计算我们的中心:

    在这里插入图片描述

    得到新的点之后我们在重新计算新的聚类

    在这里插入图片描述

    这个时候发现和上一次的结果是一致的,这个时候我们就可以停止我们的算法了。

    下面我们来看一下这个迭代过程的图谱。

    这个是我们的的初始过程
    在这里插入图片描述

    之后是我们选取中心点:
    在这里插入图片描述

    依次迭代的过程:

    在这里插入图片描述

    在这里插入图片描述




    写在后面的话

    无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程 https://www.cbedai.net/chichoxian

    喜欢的,你懂的~
    救救孩子吧
    在这里插入图片描述
    在这里插入图片描述

    Reference:

    https://www.youtube.com/watch?v=_S5tvagaQRU

    展开全文
  • 通过机器学习教学视频,初识KNN算法,对原理和算法流程通过小应用进行...1、K-Means算法原理DT,全称Decision Trees,即常说的决策树算法。2、K-Means流程框图在建立训练集时,3、K-Means代码实现参照麦子学院4、K-...

    分类是根据样本某些属性或某类特征(可以融合多类特征),把样本类型归为已确定的某一类别中。机器学习中常见的分类算法有:SVM(支持向量机)、KNN(最邻近法)、Decision Tree(决策树分类法)、Naive Bayes(朴素贝叶斯分类)、Neural Networks(神经网络法)等。

    而分类作为一种监督学习方法,需要事先知道样本的各种类别信息。因此当对海量数据进行分类时,为了降低数据满足分类算法要求所需要的预处理代价,往往需要选择非监督学习的聚类算法。

    K-Means Clustering(K均值聚类),就是最典型的聚类算法之一,接下来一起进行该算法的学习。

    1、K-Means算法原理

    K-Means算法思想:对给定的样本集,事先确定聚类簇数K,让簇内的样本尽可能紧密分布在一起,使簇间的距离尽可能大该算法试图使集群数据分为n独立数据样本,使n组集群间的方差相等,数学描述为最小化惯性或集群内的平方和。K-Means作为无监督的聚类算法,实现较简单,聚类效果好,因此被广泛使用。



    2、K-Means步骤及流程

    2.1、算法步骤

    输入:样本集D,簇的数目k,最大迭代次数N;

    输出:簇划分(k个簇,使平方误差最小);

    算法步骤:

    (1)为每个聚类选择一个初始聚类中心;

    (2)将样本集按照最小距离原则分配到最邻近聚类;

    (3)使用每个聚类的样本均值更新聚类中心;

    (4)重复步骤(2)、(3),直到聚类中心不再发生变化;

    (5)输出最终的聚类中心和k个簇划分;

    2.2、流程框图:


    3、K-Means代码实现

    Python代码实现请参考:python 实现周志华 机器学习书中 k-means 算法

    Matlab代码实现请参考:https://blog.csdn.net/u010248552/article/details/78476934?locationNum=8&fps=1

    C#代码实现请参考:https://www.cnblogs.com/gaochundong/p/kmeans_clustering.html


    4、K-Means算法优缺点

    4.1、优点

    (1)原理易懂、易于实现;

    (2)当簇间的区别较明显时,聚类效果较好;

    4.2、缺点

    (1)当样本集规模大时,收敛速度会变慢;

    (2)对孤立点数据敏感,少量噪声就会对平均值造成较大影响;

    (3)k的取值十分关键,对不同数据集,k选择没有参考性,需要大量实验;


    5、参考资料

    1、简单易学的机器学习算法——K-Means算法

    2、k-means 的原理,优缺点以及改进

    展开全文
  • 机器学习之k-means算法详解

    万次阅读 多人点赞 2019-04-15 14:03:35
    K-means算法 (无监督算法,聚类算法) 1-1 基本流程 一、概念: 二、主要特点: 三、算法流程: kmeans作用:去除奇异值 小结: 1-2 算法效果衡量标准 一、K值确定: 二、轮廓系数: 三、Canopy算法配合初始...

    K-means算法 (无监督算法,聚类算法)

    1-1 基本流程

    一、概念:

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

    聚类算法:是一种典型的无监督学习算法,主要用于将相似的样本自动归到一个类别中。
    聚类算法与分类算法最大的区别是:聚类算法是无监督的学习算法,而分类算法属于监督的学习
    算法,分类是知道结果的。
    在聚类算法中根据样本之间的相似性,将样本划分到不同的类别中,对于不同的相似度计算方法,会得到不同的聚类结果,常用的相似度计算方法有欧式距离法。

    二、主要特点:

    常用距离
    a.欧式距离
    b.曼哈顿距离
    应用:
    a.去除孤立点,离群点,只针对度量算法,解决方法(常用归一化预处理方法 )
    b.离散化

    三、算法流程:

    1.选择聚类的个数k(kmeans算法传递超参数的时候,只需设置最大的K值)
    2.任意产生k个聚类,然后确定聚类中心,或者直接生成k个中心。
    3.对每个点确定其聚类中心点。
    4.再计算其聚类新中心。
    5.重复以上步骤直到满足收敛要求。(通常就是确定的中心点不再改变。)

    kmeans作用:去除奇异值

    应为EM算法,kmeans肯定会稳定到K个中心点
    kmeans算法k个随机初始值怎么选?
    要多选几次,比较,找出最好的那个。
    a.bi-kmeans方法,依次补刀
    b.层次聚类 k = 5,找到5个中心点,接着把这个5个中心点喂给kmeans,初始中心点不同,收敛的结果也可能不一样的

    小结:

    优点:
    1、原理简单(靠近中心点) ,实现容易
    2、聚类效果中上(依赖K的选择)
    3、空间复杂度o(N)时间复杂度o(IKN)
    N为样本点个数,K为中心点个数,I为迭代次数
    缺点:
    1、对离群点, 噪声敏感 (中心点易偏移)
    2、很难发现大小差别很大的簇及进行增量计算
    3、结果不一定是全局最优,只能保证局部最优(与K的个数及初值选取有关)

    1-2 算法效果衡量标准

    一、K值确定:

    Elbow method就是“肘”方法,对于n个点的数据集,迭代计算k from 1 to n,每次聚类完成后计算每个点到其所属的簇中心的距离的平方和,可以想象到这个平方和是会逐渐变小的,直到k==n时平方和为0,因为每个点都是它所在的簇中心本身。但是在这个平方和变化过程中,会出现一个拐点也即“肘”点,下图可以看到下降率突然变缓时即认为是最佳的k值。
    这里写图片描述
    肘方法的核心指标是SSE(sum of the squared errors,误差平方和), Ci是第i个簇,
    p是Ci中的样本点, mi是Ci的质心(Ci中所有样本的均值), SSE是所有样本的聚
    类误差,代表了聚类效果的好坏。

    SSE=i=1kpCipmi2 SSE=\sum_{i=1}^{k}\sum_{p\in C_i}|p-m_i|^2

    肘方法的核心思想:
    随着聚类数k的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么误差平方和SSE自然会逐渐变小。并且,当k小于真实聚类数时,由于k的增大会大幅增加每个簇的聚合程度,故SSE的下降幅度会很大,而当k到达真实聚类数时,再增加k所得到的聚合程度回报会迅速变小,所以SSE的下降幅度会骤减,然后随着k值的继续增大而趋于平缓,也就是说SSE和k的关系图是一个手肘的形状,而这个肘部对应的k值就是数据的真实聚类数。这也是该方法被称为肘方法的原因。

    聚类效果怎么判断?
    1、SSE误差平方和越小越好,肘部拐点的地方。
    2、也可用轮廓系数表示 系数越大,聚类效果越好,簇与簇之间距离越远

    kmeans算法的最大弱点:只能处理球形的簇(理论)

    代码实现:

    import numpy as np
    from sklearn.cluster import KMeans
    from scipy.spatial.distance import cdist
    import matplotlib.pyplot as plt
    cluster1 = np.random.uniform(0.5, 1.5, (2, 10))
    cluster2 = np.random.uniform(3.5, 4.5, (2, 10))
    
    X = np.hstack((cluster1, cluster2)).T
    
    '''
    参数的意义:
    n_clusters:簇的个数,即你想聚成几类
    init: 初始簇中心的获取方法
    n_init: 获取初始簇中心的更迭次数
    max_iter: 最大迭代次数(因为kmeans算法的实现需要迭代)
    tol: 容忍度,即kmeans运行准则收敛的条件
    precompute_distances:是否需要提前计算距离
    verbose: 冗长模式(不太懂是啥意思,反正一般不去改默认值)
    random_state: 随机生成簇中心的状态条件。
    copy_x: 对是否修改数据的一个标记,如果True,即复制了就不会修改数据。
    n_jobs: 并行设置
    algorithm: kmeans的实现算法,有:'auto', 'full', 'elkan', 其中 'full'表示用EM方式实现
    '''
    K = range(1, 10)
    # print(X)
    meandistortions = []
    for k in K:
        kmeans = KMeans(n_clusters=k)
        kmeans.fit(X)
        meandistortions.append(sum(np.min(cdist(X,kmeans.cluster_centers_, 'euclidean'), axis=1)) / X.shape[0])
        '''
        # cdist(X, kmeans.cluster_centers_, 'euclidean')  求出X到cluster_centers_之间的距离
        #np.min(cdist(X,kmeans.cluster_centers_, 'euclidean'), axis=1)   按行的方向,对每一行求出一个最小值
        #sum(np.min(cdist(X,kmeans.cluster_centers_, 'euclidean'), axis=1)) 求出每次得到最小值列表的和
        # 求出每次最小值列表和的平均值
        '''
    print(meandistortions)
    plt.plot(K, meandistortions, 'bx-')
    plt.xlabel('k')
    # plt.ylabel('平均畸变程度',fontproperties=font)
    plt.ylabel('Ave Distor')
    # plt.title('用肘部法则来确定最佳的K值',fontproperties=font);
    plt.title('Elbow method value K');
    plt.show()
    

    二、轮廓系数:

    ( Silhouette Coefficient)结合了聚类的凝聚度( Cohesion)和分离度
    ( Separation),用于评估聚类的效果。该值处于-1~1之间,值越大,表示聚类效果
    越好。
    S=(ba)max(a,b)S[1,1] S=\frac{(b-a)}{max(a,b)} S \in [-1,1]
    a是Xi与同簇的其他样本的平均距离,称为凝聚度;
    b是Xi与最近簇中所有样本的平均距离,称为分离度。

    最近簇的定义:
    Cj=argminCk1npCkpXi2 C_j=arg min_{Ck}\frac{1}{n}\sum_{p \in C_k}|p-X_i|^2
    其中p是某个簇CkC_k中的样本。即,用XiX_i到某个簇所有样本平均距离作为衡量该点到该簇的距离后,选择离Xi最近的一个簇作为最近簇。
    求出所有样本的轮廓系数后再求平均值就得到了平均轮廓系数。平均轮廓系数的取值范围为[-1,1],且簇内样本的距离越近,簇间样本距离越远,平均轮廓系数越大,聚类效果越好。
    代码实现:

    import numpy as np
    from sklearn.cluster import KMeans
    from sklearn import metrics
    import matplotlib.pyplot as plt
    
    # 分割出6个子图, 并在1号作图
    plt.figure(figsize=(8, 10))
    plt.subplot(3, 2, 1)
    # 初始化原始数字点
    x1 = np.array([1, 2, 3, 1, 5, 6, 5, 5, 6, 7, 8, 9, 7, 9])
    x2 = np.array([1, 3, 2, 2, 8, 6, 7, 6, 7, 1, 2, 1, 1, 3])
    X = np.array(list(zip(x1, x2))).reshape(len(x1), 2)
    # 在1号子图做出原始数据点阵的分布
    # xlim 坐标的刻度
    plt.xlim([0, 10])
    plt.ylim([0, 10])
    plt.title('Sample')
    plt.scatter(x1, x2)
    
    # 点的颜色
    colors = ['b', 'g', 'r', 'c', 'm', 'y', 'k', 'b']
    # 点的标号
    markers = ['o', 's', 'D', 'v', '^', 'p', '*', '+']
    # 簇的个数
    tests = [2, 3, 4, 5, 8]
    subplot_counter = 1  # 训练模型
    for t in tests:
        subplot_counter += 1
        plt.subplot(3, 2, subplot_counter)
        kmeans_model = KMeans(n_clusters=t).fit(X)
        for i, l in enumerate(kmeans_model.labels_):
            plt.plot(x1[i], x2[i], color=colors[l], marker=markers[l], ls='None')
            plt.xlim([0, 10])
            plt.ylim([0, 10])
            # silhouette_score计算所有样本的平均轮廓系数。
            # kmeans_model.labels_ 每个样本的预测标签。即预测的类的标签
            # metric='euclidean' 用的方法为欧式距离
            plt.title('K = %s, SCoefficient = %.03f' % (t, metrics.silhouette_score(X, kmeans_model.labels_, metric='euclidean')))
    plt.show()
    
    

    三、Canopy算法配合初始聚类:

    1、Canopy简介:

    Canopy聚类最大的特点是不需要事先指定k值(即clustering的个数),因此具有很大的实际应用价值。 Canopy聚类虽然精度较低,但其在速度上有很大优势,因此可以使用Canopy聚类先对数据进行“粗”聚类, 得到k值后再使用K-means进行进一步“细”聚类。

    2、Canopy+Kmeans:

    a. 聚类最耗费计算的地方是计算对象相似性的时候,Canopy聚类在第一阶段选择简单、计算代价较低的方法计算对象相似性,将相似的对象放在一个子集中,这个子集被叫做Canopy,通过系列计算得到若干Canopy,Canopy之间可以是重叠的,但不会存在某个对象不属于任何Canopy的情况, 可以把这一阶段看做数据预处理;
    b . 在各个Canopy 内使用传统的聚类方法(如K-means),不属于同一Canopy的对象之间不进行相似性计算。 (即, 根据Canopy算法产生的Canopies代替初始的K个聚类中心点,由于已经将所有数据点进行Canopies有覆盖划分,在计算数据离哪个k-center最近时,不必计算其到所有k-centers的距离, 只计算和它在同一个Canopy下的k-centers这样可以提高效率)
    c、Canopy详解:
    1, 首先选择两个距离阈值: T1和T2, 其中T1 > T2
    2, 从list中任取一点P,用低计算成本方法快速计算点P与所有Canopy之间的距离(如果当前不存在Canopy,则把点P作为一个Canopy),如果点P与某个Canopy距离在T1以内,则将点P加入到这个Canopy
    3, 如果点P曾经与某个Canopy的距离在T2以内,则需要把点P从list中删除,这一步是认为点P此时与这个Canopy已经够近了, 因此它不可以再做其它Canopy的中心了
    4, 重复步骤2、 3, 直到list为空结束
    这里写图片描述
    优点:
    1、 Kmeans对噪声抗干扰较弱,通过Canopy对比,将较小的NumPoint的Cluster直接去掉有利于抗干扰。
    2、 Canopy选择出来的每个Canopy的centerPoint作为K会更精确。
    3、 只是针对每个Canopy的内做Kmeans聚类, 减少相似计算的数量。
    缺点:
    算法中 T1、 T2(T2 < T1) 的确定问题

    四、Calinski-Harabasz Index:

    Calinski-Harabasz:类别内部数据的协方差越小越好,类别之间的协方差越大越好,这样的Calinski-Harabasz分数s会高, 分数s高则聚类效果越好
    s(k)=tr(Bk)tr(Wk)mkk1 s(k) = \frac{tr(B_k)}{tr(W_k)}\frac{m-k}{k-1}
    其中m为训练集样本数, k为类别数。 BkB_k为类别之间的协方差矩阵, WkWk为类别内部数据的协方差矩阵。 tr为矩阵的迹。

    1-2 算法优化

    四种硬聚类算法(K-means++,二分K-means,ISODATA和Kernel K-means)

    K-means++:

    2007年由D. Arthur等人提出的K-means++针对图1中的第一步做了改进。可以直观地将这改进理解成这K个初始聚类中心相互之间应该分得越开越好。

    那么初始点怎么选呢?
    第一个簇心A随机找,是因为一开始你不知道哪个是簇心;
    第二个簇心B要找距离A最远的,是因为簇心之间要相距远一些,如果很近的话,很容易当作一类,影响聚类效果;
    第三个簇心C也是同样的,它得离A、B远一些;
    其它依次类推。

    怎么选取下一个聚类中心,整个算法的描述如下图所示:
    图2. K-means++算法
    这里写图片描述
    下面结合一个简单的例子说明K-means++是如何选取初始聚类中心的。数据集中共有8个样本,分布以及对应序号如下图所示:
    图3. K-means++示例:
    这里写图片描述
    假设经过图2的步骤一后6号点被选择为第一个初始聚类中心,那在进行步骤二时每个样本的D(x)和被选择为第二个聚类中心的概率如下表所示:
    这里写图片描述

    其中的P(x)就是每个样本被选为下一个聚类中心的概率。最后一行的Sum是概率P(x)的累加和,用于轮盘法选择出第二个聚类中心。方法是随机产生出一个0~1之间的随机数,判断它属于哪个区间,那么该区间对应的序号就是被选择出来的第二个聚类中心了。例如1号点的区间为[0,0.2),2号点的区间为[0.2, 0.525)。
    从上表可以直观的看到第二个初始聚类中心是1号,2号,3号,4号中的一个的概率为0.9。而这4个点正好是离第一个初始聚类中心6号点较远的四个点。这也验证了K-means的改进思想:即离当前已有聚类中心较远的点有更大的概率被选为下一个聚类中心。可以看到,该例的K值取2是比较合适的。当K值大于2时,每个样本会有多个距离,需要取最小的那个距离作为D(x)。

    ISODATA:

    》 类别数目随着聚类过程而变化;
    》 对类别数的“合并”: ( 当聚类结果某一类中样本数太少, 或两个类间的距离太近时)(样本太少或太散会被打散)
    》 “分裂”( 当聚类结果中某一类的类内方差太大, 将该类进行分裂)

    Kernel k-means:

    kernel k-means实际上公式上,就是将每个样本进行一个投射到高维空间的处理,然后再将处理后的数据使用普通的k-means算法思想进行聚类。

    二分K-means:

    首先将所有点作为一个簇,然后将该簇一分为二。之后选择能最大限度降低聚类代价函数(也就是误差平方和)的簇划分为两个簇。 以此进行下去,直到簇的数目等于用户给定的数目k为止。

    Mini Batch K-Means

    对大数据分小批量处理

    展开全文
  • k-means聚类算法原理简析

    万次阅读 多人点赞 2019-01-26 23:06:44
    K-means算法是最普及的聚类算法,也是一个比较简单的聚类算法,所以刚接触的同学不要感到害怕。算法接受一个未标记的数据集,然后将数据聚类成不同的组,同时,k-means算法也是一种无监督学习。 算法思想 k-means...
  • K-means算法的实现原理和分析

    万次阅读 2017-07-08 17:36:21
    K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一。K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类。通过迭代的方法,逐次更新各聚类中心的值,直至得到...
  • 基本Kmeans算法介绍及其实现

    万次阅读 多人点赞 2014-04-17 11:38:35
    1.基本Kmeans算法[1] 选择K个点作为初始质心 repeat 将每个点指派到最近的质心,形成K个簇 重新计算每个簇的质心 until 簇不发生变化或达到最大迭代次数时间复杂度:O(tKmn),其中,t为迭代次数,K为簇的数目,m...
  • k-means聚类算法原理与参数调优详解

    万次阅读 2019-05-16 08:31:07
    k-means算法原理 K-means中心思想:事先确定常数K,常数K意味着最终的聚类类别数,首先随机选定初始点为质心,并通过计算每一个样本与质心之间的相似度(这里为欧式距离),将样本点归到最相似的类中,接着,重新计算...
  • KMeans 算法(一)

    万次阅读 多人点赞 2019-03-11 23:06:32
    K-means算法简述 K-means算法,也称为K-平均或者K-均值,一般作为掌握聚类算法的第一个算法。 这里的K为常数,需事先设定,通俗地说该算法是将没有标注的 M 个样本通过迭代的方式聚集成K个簇。 在对样本进行聚集的...
  • 聚类k-means算法详解

    万次阅读 2020-06-15 11:03:54
    前言 俗话说:“物以类聚,人以群分”,在自然科学和社会科学中,存在着大量的分类问题。所谓类,通俗地说,就是指相似元素的集合。 而对于分类问题,我们通常不会提供x与y这样的映射关系,对于这种用机器自动找出...
  • 深入浅出聚类算法之k-means算法

    万次阅读 多人点赞 2018-08-13 18:15:17
    k-means是一个十分简单的聚类算法,它的思路非常简明清晰,所以经常拿来当做教学。下面就来讲述一下这个模型的细节操作。 内容 模型原理 模型收敛过程 模型聚类个数 模型局限 1. 模型原理 将某一些数据分为...
  • 深入理解K-Means聚类算法

    万次阅读 多人点赞 2016-12-18 20:50:05
    概述什么是聚类分析聚类分析是在数据中发现数据对象之间的关系,将数据进行分组,组内的相似性越大,组间的差别越大,则聚类效果越好。不同的簇类型聚类旨在发现有用的对象簇,在现实中我们用到很多的簇的类型,使用...
  • K-Means聚类算法的研究与改进

    万次阅读 2018-04-25 17:33:57
    代码:https://github.com/dengsiying/K-Means-improvement.gitK-Means聚类算法的研究与改进*1(华中师范大学 计算机学院,湖北 武汉 430079)摘 要:K-Means算法是基于划分的聚类算法中的一个典型算法,该算法有操作...
  • ML之Clustering之K-means:K-means算法简介、应用、经典案例之详细攻略 目录 K-means算法简介 1、K-means算法适用的数据类型​ 2、K-Means算法的全局最优解和局部最优解的比较 1、K-means算法的过程及其...
  • K-means算法研究综述

    万次阅读 2017-03-18 10:55:01
    K-means算法研究综述 聚类被认为是机器学习中最常使用的技术之一, 它历史悠久、应用广泛,几乎应用于环境学、医学、生物学、天文学、经济学等各个领域。其中K-means是最为常用的聚类算法。现在我们来详细介绍一下...
  • k-means算法详解

    万次阅读 2018-05-03 11:58:19
    k-means算法详解 主要内容 k-means算法简介 k-means算法详解 k-means算法优缺点分析 k-means算法改进算法k-means++ 1、k-means算法简介   k-means算法是一种聚类算法,所谓聚类,即根据相似性原则,将具有...
  • k-means算法优缺点

    千次阅读 2018-04-10 20:37:20
    K-Means的主要优点: 1)原理简单,容易实现 2)可解释度较强 K-Means的主要缺点: 1)K值的选取困难 2)局部最优 3)对噪音和异常点敏感 4)需样本存在均值(限定数据种类) 5)聚类效果依赖于聚类中心的初始化 6...
  • k-means聚类算法过程与原理

    万次阅读 2018-08-15 20:05:44
    k-means算法k-均值聚类算法)是一种基本的已知聚类类别数的划分算法。它是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的...
  • [聚类算法]K-means优缺点及其改进

    万次阅读 多人点赞 2016-03-14 12:07:11
    K-means聚类小述大家接触的第一个聚类方法,十有八九都是K-means聚类啦。该算法十分容易理解,也很容易实现。其实几乎所有的机器学习和数据挖掘算法都有其优点和缺点。那么K-means的缺点是什么呢? 总结为下: (1)...
  • K-Means聚类算法的4个步骤流程!

    万次阅读 2016-11-14 16:38:47
    聚类分析是我们数据挖掘中常用的算法,常常用于没有分类,但又有相关相似性的样本研究当中,包括...一般来说,K-Means算法是典型的基于距离的非层次聚类算法,在最小化误差函数的基础上将数据划分为预定的类数K,采用距
1 2 3 4 5 ... 20
收藏数 48,013
精华内容 19,205
关键字:

k-means算法