精华内容
下载资源
问答
  • k均值:k均值算法
  • 这是先实现k均值算法,再在这个基础上实现约束种子k均值算法k均值算法有直接调用接口实现,有用代码一步一步实现,训练数据清晰,每一个函数都有解释,是一个学习k均值算法很好的资源。
  • K均值算法

    2018-08-21 14:55:21
    K均值算法   K均值算法是一种聚类算法,把样本分配到离它最近的类中心所属的类,类中心由属于这个类的所有样本确定。   k均值算法是一种无监督的聚类算法。算法将每个样本分配到离它最近的那个类中心所代表的...

    K均值算法

     

    K均值算法是一种聚类算法,把样本分配到离它最近的类中心所属的类,类中心由属于这个类的所有样本确定。

     

    k均值算法是一种无监督的聚类算法。算法将每个样本分配到离它最近的那个类中心所代表的类,而类中心的确定又依赖于样本的分配方案。

     

    在实现时,先随机初始化每个类的类中心,然后计算样本与每个类的中心的距离,将其分配到最近的那个类,然后根据这种分配方案重新计算每个类的中心。这也是一种分阶段优化的策略。

     

    与k近邻算法一样,这里也依赖于样本之间的距离,因此需要定义距离的计算方式,最常用的是欧氏距离,也可以采用其他距离定义。算法在实现时要考虑下面几个问题:

     

    1.类中心向量的初始化。一般采用随机初始化。最简单的是Forgy算法,它从样本集中随机选择k个样本作为初始类中心。第二种方案是随机划分,它将所有样本随机的分配给k个类中的一个,然后按照这种分配方案计算各个类的类中心向量。

     

    2.参数k的设定。可以根据先验知识人工指定一个值,或者由算法自己确定。

     

    3.迭代终止的判定规则。一般做法是计算本次迭代后的类中心和上一次迭代时的类中心之间的距离,如果小于指定阈值,则算法终止。

     

     

     

     

     

    展开全文
  • K-MEANS(K均值聚类算法,C均值算法) K-MEANS(K均值聚类算法,C均值算法) K-MEANS(K均值聚类算法,C均值算法)
  • 简单实现平面的点K均值分析,使用欧几里得距离,并用pylab展示。 复制代码 代码如下:import pylab as pl #calc Euclid squiredef calc_e_squire(a, b): return (a[0]- b[0]) ** 2 + (a[1] – b[1]) **2 #init the ...
  • K均值算法.pdf

    2021-09-14 12:34:37
    K均值算法.pdf
  • 模式识别K均值算法

    2015-04-27 16:37:33
    K均值算法程序源代码,K均值算法是模式识别里比较基础的算法,需要掌握
  • k均值算法c++语言实现代码
  • k-means kmeans k均值 算法 用java实现的k均值算法 200行左右 可以通过文件读取空间二维点坐标,聚类结果将格式化输出到文本,利用excel就可以实现可视化
  • k均值算法matlab

    2015-01-15 20:28:37
    matlab实现k均值算法,进行三维数据的模式分类
  • k均值算法代码

    2014-06-15 13:34:25
    关于k均值算法c++代码 控制台程序对图像进行聚类
  • K均值算法的Matlab代码

    2018-01-07 19:30:57
    K均值算法的简介
  • k均值算法报告

    2013-01-03 21:10:02
    内含k均值算法的具体代码,以及运行之后的界面显示,文档包括的内容较详细。
  • LBG算法、Lloyd算法和K均值算法

    万次阅读 2017-07-25 02:07:56
    关于LBG算法,Lloyd算法和K均值算法的简介

    ---------------------------------LBG算法、Lloyd算法和K-Means算法---------------------------------


    LBG算法是一种矢量量化算法,由Lloyd算法推广而来。在编码过程中,我们可以先对信源输出进行分组,再将每个组看做一个整体块进行编码,这样可以得到高效的有损或无损压缩算法。其实量化过程同样可以这么做,我们将数据块视为矢量,所以这类量化称为矢量量化。较之通常的标量量化,使用矢量量化所得失真度将更低,其原因是:

    1.由于信源输出之间的相关性结构,研究整个信源输出序列要比分别研究每个样本更为高效。

    2.即使信源输出不相关,矢量量化也比标量量化更高效,因为随着研究的信源序列的长度增加,设计算法就会更加灵活,可以与信源的统计特性更匹配。

    LBG算法由Lloyd算法推广而来,而Lloyd算法由源于K均值算法聚类方法。所以我们从K均值算法开始一步步来介绍。

    1.K-Means算法

    K-means算法主要用于对数据聚类。


    如上左图所示,我们很容易看出图中的点分成上右图中的了4个点群,而K-Means算法能让计算机也可以知道这件事。

    K-Means算法原理如下(避免截图,没有使用公式- -!):

    1. 随机在图中任取K个点为种子点;

    2. 计算图中所有点到这K个种子点的距离,设图中原有点位q1-qn,这K个种子点为n1-nK,如果qi离ni点最近,那么令qi属于ni点群;

    3. 通过第二步,我们得到了K个点群,每个点群包含一定数量的原有点和本身的一个种子点(这些点离该点群的种子点的距离比离其他种子点都近);

    4. 逐个计算上述K个点群的质心,并将属于自己点群的那个种子点移动到该位置;

    5. 重复2-4步,直到所有种子点不再移动。

    K-means算法原理很简单,仅仅用到了一个求距离的公式和一个求中心点的公式(比如计算所有点的x和y坐标的均值)。

    然后是Lloyd算法。


    2.Lloyd算法

    Lloyd算法工作方式:



    然后转到第2步。

    Linde、Buzo和Gray将该算法推广到输入为矢量的情形,这就是LBG算法,亦称为广义Lloyd算法。


    3. LBG算法

    LBG算法的大致步骤为:


    可以看到LBG算法与K-Means算法非常类似,同样是一步步迭代,失真度定义为了一个与距离相关的量,然后当失真度相对变化程度小于一个阈值时停止。它将K-Means算法推广到了矢量领域。

    同时可以看出LBG算法也存在一定的问题,比如:

    1.其计算复杂度相比于K均值算法大大增加。虽然LBG算法可以保证某次迭代的失真不会大于上一次的失真,但并不能保证收敛到确定的最优点。

    2.LBG算法非常依赖于训练集的真实程度,而非常具有代表性的训练集并不容易找到,所以当没有训练集时并不是很实用。而且算法是当新的码矢量与原码矢量变化不大时,就停止码书的训练,但这并不能保证这时就是最优的情况。


    展开全文
  • c++ K均值算法

    2011-12-15 22:21:11
    最近在学各种人工智能算法,花了几个小时把k均值算法编出来了,心里还是挺高兴的,欢迎大家与我进行学习交流~~
  • K均值算法代码

    2012-09-11 14:07:34
    数据挖掘中k均值算法的代码,适合学习数据挖掘的初学者。
  • 通过比较目标函数、聚类原型模式P(0)的初始化方法、划分矩阵U和聚类原型p的更新方法等4个方面,得出k均值算法和硬C-均值算法的区别。
  • 聚类算法——K均值算法的matlab程序,数据来源为80个平面上的点。
  • K均值算法一个是一维的,另一个是二维的 K中心点算法
  • K均值算法分类随机点

    2019-04-19 14:38:40
    K均值算法对一系列随机的点进行分类,并作图,画出其聚类中心,并用不同颜色标注不同类别的点。matla编写。
  • 一.K-均值聚类(K-means)概述 1.聚类 “类”指的是具有相似形得几何。聚类是值将数据集划分为若干类,是的类内之间得数据最为相似,各类之间的数据相似度差别尽可能大。聚类分析就是以相似性为基础,对数据集进行...

    一.K-均值聚类(K-means)概述

    1.聚类

    “类”指的是具有相似形得几何。聚类是值将数据集划分为若干类,是的类内之间得数据最为相似,各类之间的数据相似度差别尽可能大。聚类分析就是以相似性为基础,对数据集进行聚类划分,属于无监督学习。

    2.无监督学习和监督学习

    K-均值聚类属于无监督学习。监督学习知道从对象(数据)中学习什么,而无监督学习无需知道所要搜寻的目标,它根据算法得到数据的共同特征。比如用分类和聚类来说,分类事先就知道所要得到的类别,而聚类是以相似度为基础,将对象就分得不同的簇。

    3.K-means

    K-means算法是一种简单的迭代型聚类算法,采用距离作为相似性指标,从而发现给定数据集中的K个类,且每个类的中心是根据类中所有值的均值得到,每个类用聚类中心来描述。对于给定的一个包含n个d 维数据点的数据集X以及要分得的类别K,选取欧式距离作为相似度指标,聚类目标是使得各类的聚类平方和最小,即最小化:
    在这里插入图片描述
    结合最小二乘法和拉格朗日原理,聚类中心为对应类别中各数据点的平均值,同时为了使得算法收敛,在迭代过程中,应使最终聚类中心尽可能的不变。

    二.K均值聚类算法实现

    1.K均值聚类算法流程

    K-means是一个反复迭代的过程,算法分为四个步骤:

    1) 选取数据空间中的K个对象作为初始中心,每个对象代表一个聚类中心:

    2) 对于样本中的数据对象,根据他们与这些聚类中心的欧氏距离,按距离最近的准则将它们分到距离它们最近的聚类中心(最相似)所对应的类;

    3) 更新聚类中心:将每个类别中所有对象所对应的均值作为该类别的聚类中心,计算目标函数的值:

    4) 判断聚类中心和目标函数的值是否发生改变,若不变,则输出结果,若改变,则返回2)。

    2.K均值聚类Matlab实现

    1)自主选择数据测试:利用mvnrnd()函数在一定范围内创造随机数,并作图,生成的随机二维分布图形见图1:
    在这里插入图片描述
    2)分析类别数K的设定:K值的确定可以由以下方法确定:1、根据实际需要;2、肘部法则;3、轮廓系数;4、层次聚类;5、Canopy算法;6、间隔统计量 Gap Statistic;

    本文采用层次聚类的方法确定K的取值。层次聚类是通过可视化然后认为去判断大致聚为积累,很明显在共同父节点的一颗子树可以被聚类为一类。分层聚类图见图2:
    在这里插入图片描述

    图2

    从图中我们可以看到K可以取3。

    3)初始质心的选取:选择适当的初始质心是基本K-means算法的关键步骤。

    方法1:随机选取初始质心,但是这样簇的质量常常很差。处理选取初始质心问题的一种常用技术是“多次运行,每次使用一组不同的随机初始质心,然后选取具有最小SSE的簇集。

    方法2:取一个样本,并使用层次聚类技术对它聚类。从层次聚类中提取K个簇,并用这些簇的质心作为初始质心。适用于小样本。

    方法3:随机选择第一个点,或去所有点的质心作为第一个点。然后,对于每个后继初始质心,选择已经选取过的初始质心最远的点。使用这种方法,确保了选择的初始质心不仅是随机的,而且是散开的。但是,这种方法可能选中离群点。

    方法4:canopy算法。

    本文随机选取质心,见图3:

    在这里插入图片描述

    图3

    5) 距离的度量:常用的距离度量方法包括:欧几里得距离和余弦相似度。欧氏距离是最常见的距离度量,二余弦相似度是最常见的相似度度量,借助图4三维坐标系来看下欧氏距离和余弦相似度的区别:

    在这里插入图片描述

    图4:三维坐标系

    从图上可以看出距离度量衡量的是空间各点间的绝对距离,跟各个点所在的位置坐标(即个体特征维度的数值)直接相关;而余弦相似度衡量的是空间向量的夹角,更加的是体现在方向上的差异,而不是位置。本文选择欧式距离来对距离进行度量,欧氏距离公式见(2):

    在这里插入图片描述

    6) 聚类效果展示如图5:

    在这里插入图片描述

    图5

    7) 聚类效果评估:Kmeans是一种非监督学习,没有标签和其他信息来比较聚类结果。从图5的结果可以清晰的看到算法具有一定的聚类效果,本文采用MCR进行验证,结果见图6

    在这里插入图片描述

    图6

    多次计算平均求得的MCR= 0.66,表明误分率还是蛮大的,聚类效果并不是很理想,究其原因:虽然算法收敛,但算法只是收敛到了局部最小值,而并非全局最小值。

    三.模糊K均值算法

    模糊K-均值算法由K-均值算法派生而来的。K-均值算法在聚类过程中,每次得到的结果虽然不一定是预期的效果,但类别之间的边界是明确的,聚类中心根据各类当前具有的样本进行修改。模糊K-均值算法在聚类过程中,每次得到的类别边界仍是模糊的,每类聚类中心的修改都需要用到所有样本,此外聚类准则也体现了模糊性。

    四.模糊K-均值算法

    1.模糊K-均值算法过程

    模糊K-均值算法基本思想是首先设定一些类及每个样本对各类的隶属度;然后通过迭代,不断调整隶属度至收敛。收敛条件是隶属度的变化量小于规定的阈值。具体步骤如下:

    (1)
    确定模式类数K,1<K≤N,N是样本个数。

    (2)
    根据先验知识确定样本属于各类的隶属度,建立初始隶属度矩阵U(0)=[],其中i为类别编号、矩阵的行号,j为样本编号、矩阵的列号。表示第j个元素对第i个类的隶属度。对隶属度矩阵的第j列而言,它表示第j个元素分别对各模式类的隶属度,因此矩阵的每列元素之和为1。

    (3)
    求各类的聚类中心L是迭代次数。见公式(3):

    在这里插入图片描述

    式中,参数m≥2,是一个控制聚类结果模糊程度的参数。可以看出各聚类中心的计算必须用到全部的N个样本,这是与一般(非模糊)K-均值算法的区别之一。在一般(非模糊)K-均值算法中,某一类的聚类中心仅由该类样本决定,不涉及其他类。

    (4)
    计算新的隶属度矩阵U(K+1),矩阵元素计算如下:
    在这里插入图片描述
    式中,是第L次迭代完成时,第j个样本到第i类聚类中心的距离。为避免分母为零,特别的
    在这里插入图片描述
    5) 回到(3)求聚类中心,重复至收敛。收敛条件:

    在这里插入图片描述
    ,其中为规定的参数。 (6)

    当算法收敛时,就得到了各类的聚类中心以及表示个样本对各类隶属程度的隶属度矩阵,模糊聚类到此结束。这时,准则函数
    在这里插入图片描述

    达到最小。

    (6) 根据隶属度矩阵U(L+1)进行聚类,按照隶属原则进行划分,即


    在这里插入图片描述
    .模糊K均值matlab实现

    1.沿用上面用K均值聚类的的数据随机创造一组数据,见图6;

    在这里插入图片描述

    图6

    2.沿用上面K均值聚类确定K值的方法确定K值,取K=3。

    3.根据先验知识确定初始隶属度矩阵,利用matlab的rand()函数初始化隶属度矩阵U(0),并归一化,见图7:

    在这里插入图片描述

    图7

    其中,cluster_n为聚类中心个数,即K值,data_n为样本点数,U为隶属度矩阵。

    4.模糊K均值聚类时迭代的一步:计算新的隶属度矩阵,先求样本点到聚类中心的距离d,见图8:

    在这里插入图片描述

    图8

    然后利用求得的距离d,带入公式求解新的隶属度矩阵,见图9:

    在这里插入图片描述

    图9

    并求得目标函数值,见图10:

    在这里插入图片描述

    图10

    将新得的聚类中心和隶属度值重新分配进行下一次迭代。

    5.设置隶属度最小变化量,当变化量小于这个阈值时,迭代终止,见图11:

    在这里插入图片描述

    图11

    变化量小于设定阈值,跳出迭代。

    3.聚类效果展示,见图12:

    在这里插入图片描述

    图12

    五.总结

    通过实验,我们发现K均值聚类的优缺点:

    优点:

    1.算法快速、简单;

    2.对大数据集有较高的效率并且是可伸缩性的;

    3.时间复杂度近于线性,而且适合挖掘大规模数据集。

    缺点:

    1.在 K-means 算法中 K 是事先给定的,这个 K 值的选定是非常难以估计的。很多时候,事先并不知道给定的数据集应该分成多少个类别才最合适。

    2.在 K-means 算法中,首先需要根据初始聚类中心来确定一个初始划分,然后对初始划分进行优化。这个初始聚类中心的选择对聚类结果有较大的影响,一旦初始值选择的不好,可能无法得到有效的聚类结果。

    3.从 K-means 算法框架可以看出,该算法需要不断地进行样本分类调整,不断地计算调整后的新的聚类中心,因此当数据量非常大时,算法的时间开销是非常大的。

    一K均值聚类程序:
    clear all;close
    all;clc;
    %% 随机生成数据
    % 第一组数据
    mu1=[0 0 ]; %均值
    S1=[.1 0 ;0.1]; %协方差
    data1=mvnrnd(mu1,S1,100); %产生高斯分布数据
    %第二组数据
    mu2=[1.25 1.25 ];
    S2=[.1 0 ;0 .1];
    data2=mvnrnd(mu2,S2,100);
    % 第三组数据
    mu3=[-1.25 1.25 ];
    S3=[.1 0 ;0 .1];
    data3=mvnrnd(mu3,S3,100);
    % 显示数据
    plot(data1(:,1),data1(:,2),‘b+’);
    hold on;
    plot(data2(:,1),data2(:,2),‘r+’);
    plot(data3(:,1),data3(:,2),‘g+’);
    grid on;
    % 三类数据合成一个不带标号的数据类
    data=[data1;data2;data3];
    %% 分层聚类确定K值
    eucD =pdist(data,‘euclidean’);
    clustTreeEuc =linkage(eucD,‘average’);
    cophenet(clustTreeEuc,eucD);
    P3 = figure;clf;
    [h,nodes] = dendrogram(clustTreeEuc,20);
    set(gca,‘TickDir’,‘out’,‘TickLength’,[.0020],‘XTickLabel’,[]);
    %% 随机产生聚类中心
    N=3;%设置聚类数目
    [m,n]=size(data);
    pattern=zeros(m,n+1);
    center=zeros(N,n);%初始化聚类中心
    pattern(:,1:n)=data(:😅;
    for x=1:N
    center(x,:)=data( randi(300,1)😅;%第一次随机产生聚类中心
    end
    %% 迭代过程
    while 1
    distence=zeros(1,N);
    num=zeros(1,N);
    new_center=zeros(N,n);
    for x=1:m
    for y=1:N
    distence(y)=norm(data(x,:)-center(y,:));%计算到每个类的距离
    end
    [~, temp]=min(distence);%求最小的距离
    pattern(x,n+1)=temp;
    end
    k=0;
    for y=1:N
    for x=1:m
    if pattern(x,n+1)== y
    new_center(y,:)=new_center(y,:)+pattern(x,1:n);
    num(y)=num(y)+1;
    end
    end
    new_center(y,:)=new_center(y,:)/num(y);
    if norm(new_center(y,:)-center(y,:))<0.1
    k=k+1;
    end
    end
    if k==N
    break;
    else
    center=new_center;
    end
    end
    [m,
    n]=size(pattern);
    %% 最后显示聚类后的数据
    figure;
    hold on;
    for i=1:m
    if pattern(i,n)==1
    plot(pattern(i,1),pattern(i,2),‘r*’);
    plot(center(1,1),center(1,2),‘ko’);
    elseif pattern(i,n)==2
    plot(pattern(i,1),pattern(i,2),‘g*’);
    plot(center(2,1),center(2,2),‘ko’);
    elseif pattern(i,n)==3
    plot(pattern(i,1),pattern(i,2),‘b*’);
    plot(center(3,1),center(3,2),‘ko’);
    elseif pattern(i,n)==4
    plot(pattern(i,1),pattern(i,2),‘y*’);
    plot(center(4,1),center(4,2),‘ko’);
    else
    plot(pattern(i,1),pattern(i,2),‘m*’);
    plot(center(4,1),center(4,2),‘ko’);
    end
    end
    grid on;
    [cidx3,cmeans3,sumd3,D3]= kmeans(data,3,‘dist’,‘sqEuclidean’);
    P4 = figure;clf;
    [silh3,h3] =silhouette(data,cidx3,‘sqeuclidean’);
    %% 采用MCR判定聚类效果
    B = pattern(:,3);
    B = reshape(B,1,m);
    A = [ones(1,100),2 * ones(1,100),3ones(1,100),4 * ones(1,100)];
    sum = 0;
    for i = 1:m
    if ( A(1,i) ~= B(1,i))
    sum = sum + 1;
    end
    end
    MCR = sum / m;
    fprintf(‘MCR =%d\n’,MCR);
    二模糊K均值程序
    function [U,
    V,objFcn] = myfcm(data, c, T, m, epsm)
    % fuzzy c-means
    algorithm
    % 输入: data: 待聚类数据,n行s列,n为数据个数,s为每个数据的特征数
    % c : 聚类中心个数
    % m : 模糊系数
    % 输出: U : 隶属度矩阵,c行n列,元素uij表示第j个数据隶属于第i类的程度
    % V : 聚类中心向量,c行s列,有c个中心,每个中心有s维特征
    % see also :
    mydist.m myplot.m
    if nargin < 3
    T = 100;
    %默认迭代次数为100
    end
    if nargin < 5
    epsm = 1.0e-6; %默认收敛精度
    end
    if nargin < 4
    m = 2;
    %默认模糊系数值为2
    end
    [n, s] = size(data);
    % 初始化隶属度矩阵U(0),并归一化
    U0 = rand(c, n);
    temp = sum(U0,1);
    for i=1:n
    U0(:,i) = U0(:,i)./temp(i);
    end
    iter = 0;
    V(c,s) = 0; U(c,n) =
    0; distance(c,n) = 0;
    while( iter<T )
    iter = iter + 1;
    % U = U0;
    % 更新V(t)
    Um = U0.^m;
    V = Um
    data./(sum(Um,2)*ones(1,s)); % MATLAB矩阵相乘啊,好东西
    % 更新U(t)
    for i = 1:c
    for j = 1:n
    distance(i,j) =
    mydist(data(j,:),V(i,:));
    end
    end
    U=1/(distance.m.*(ones(c,1)*sum(distance.(-m))));
    objFcn(iter) = sum(sum(Um.*distance.^2));
    % FCM算法停止条件
    if norm(U-U0,Inf)<epsm
    break
    end
    U0=U;
    end
    myplot(U,objFcn);
    function d = mydist(X,Y)
    % 计算向量Y到向量X的欧氏距离的开方
    d =
    sqrt(sum((X-Y).^2));
    end

    展开全文
  • c++实现k均值算法

    2018-07-04 11:01:14
    使用c++实现k均值聚类分析算法,对给定的测试数据进行分类测试,其中,画图使用opencv库
  • 竞争K均值算法中的权重
  • k均值算法程序

    2012-06-12 17:28:05
    模式识别中聚类分析经典算法,K-均值算法,C语言编写,可以读入文件,处理任意维数和任意个数的特征向量,附有测试数据。
  • K均值算法 源代码

    2012-04-17 14:07:55
    K均值算法代码This directory contains code implementing the K-means algorithm. Source code may be found in KMEANS.CPP. Sample data isfound in KM2.DAT.
  • K均值算法 比较容易

    2012-06-11 11:09:38
    不错 K均值算法 比较容易

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 63,382
精华内容 25,352
关键字:

k均值算法介绍