• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

matlab实现Kmeans聚类

武飞扬头像
一个编程的菜鸡
帮助1

K-means聚类的建模与求解

1.建模前准备

建模前,我们小组通过阅读文献,研究讨论了K-means的实现原理和应用场景,认为K-means算法在求解用户出行分区信息上具有可行性。

2.模型建立

       通过对问题的分析,我们将k-means聚类模型建立如下:

学新通

3.模型求解及检验

       我们分别通过调用matlab的K-means函数方法以及底层实现K-means方法,实现了k-means算法

       对于借助matlab函数的k-means函数实现的方式,我们最终得到的聚类结果如下:

学新通

图4 Kmeans结果图(调用函数)

       对于底层实现K-means的方式,我们得到的聚类结果如下:

学新通

图5 Kmeans结果图(底层实现)

       将两组数据进行对比分析,我们可以发现:

  1. 共性:相邻地区的点往往处于同一个类下,说明我们的K-means算法从实验效果上来看具有可行性。
  2. 异性:两组聚类效果并不完全一致。我们小组通过讨论分析,我们意识到K-means算法对于初始类的选择尤为敏感,而两种实现方式的初始类选择不同,所以聚类结果有略微差距。

4.项目代码

  1.  
    function [index,C,sumd,dim]=K_means(data,k,threshold,N)
  2.  
    %设定最大的迭代次数
  3.  
    iter=0;
  4.  
    dim=size(data);%计算样本维度
  5.  
    index=zeros(dim(1),1);
  6.  
    dist=zeros(k,1);
  7.  
    C = data(randperm(dim(1), k), :);%随机选择K个聚类中心
  8.  
    while 1
  9.  
    sumd=zeros(dim(1),1);
  10.  
    for i=1:dim(1)
  11.  
    for j=1:k
  12.  
    X=[data(i,:);C(j,:)];
  13.  
    dist(j)=get_distance(X,2) %计算样本点与聚类中心点之间的欧氏距离
  14.  
    end
  15.  
    [d,idx]=min(dist);
  16.  
    sumd(i)=d;
  17.  
    index(i)=idx;
  18.  
    end
  19.  
    new_C=zeros(k,dim(2));%新的类中心
  20.  
    c=0;
  21.  
    for i=1:k
  22.  
    count=0;
  23.  
    for j=1:dim(1)
  24.  
    if index(j)==i
  25.  
    count=count 1;
  26.  
    new_C(i,:)=new_C(i,:) data(j,:);
  27.  
    end
  28.  
    end
  29.  
    new_C(i, :) = new_C(i, :) / count; %¾聚类中心求均值
  30.  
    Y = [new_C(i, :);C(i, :)];
  31.  
    if get_distance(Y, 2)<= threshold
  32.  
    c = c 1;
  33.  
    end
  34.  
    end
  35.  
    iter = iter 1;
  36.  
    if c == k
  37.  
    break
  38.  
    elseif iter > N %大于迭代次数就退出
  39.  
    break
  40.  
    else
  41.  
    C = new_C;
  42.  
    end
  43.  
    end
  44.  
    end
  45.  
     
  46.  
    function dist = get_distance(X,p)
  47.  
    %计算两点之间的相似度
  48.  
    dim = size(X);
  49.  
    sum = 0;
  50.  
    for i = 1:dim(2)
  51.  
    sum = sum abs(X(1,i)-X(2,i))^p;
  52.  
    end
  53.  
    dist = sum^(1/p);
  54.  
    end
  55.  
     
  56.  
     
  57.  
    function r=plot_data(data,index,k)
  58.  
    figure
  59.  
    color_index=[[1,0,0],[0,1,0],[0,0,1],[0.5,0.5,0.5],[0,0,0],[1,1,0],[0.5,0.16,0.16],[0,1,1],[0.63,0.13,0.94],[1,0,1]];
  60.  
    for j=1:k
  61.  
    for i=1:length(data(:,1))
  62.  
    if index(i)==j
  63.  
    plot(data(i,1),data(i,2),'color',color_index(j))
  64.  
    end
  65.  
    end
  66.  
    end
  67.  
    end
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhghffei
系列文章
更多 icon
同类精品
更多 icon
继续加载