以K-means算法为例,实现了如下功能

  1. 自动生成符合高斯分布的数据,函数名为gaussianSample.m
  2. 实现多次随机初始化聚类中心,以找到指定聚类数目的最优聚类。函数名myKmeans.m
  3. 自动寻找最佳聚类数目,函数名称besKmeans.m,并绘制了拐点图(L图)

gaussianSample.m

function [data] = gaussianSample(n,m,mu,sigma,sigma1)
% 生成n个符合多元高斯分布的样本
% data = gaussianSample(n,m,mu,sigma,mu1,sigma1)
% 生成一个符合高斯分布的数据集data
% n表示生成的数量,m表示每个簇的点的数量
% 先通过mu与sigma生成簇中心的分布情况
% 在通过簇中心分布mu1与sigma1生成每个簇的的分布情况
% mu与mu1为均值,sigma与sigma1为协方差矩阵。 % % 默认值生成2维数据
% m = 100;
% mu = [5,5];
% sigma = [16 0;0 16];
% sigma1 = [0.5,0;0,0.5]; % 生成中心点分布
mu1 = mvnrnd(mu,sigma,n);
% 生成数据
data = [];
for i = 1:n
temp = mvnrnd(mu1(i,:),sigma1,m);
data = [data;temp];
end % % 可视化样本,以二维数据为例
% hold on;
% plot(data(:,1),data(:,2),'ko','MarkerFaceColor','y');
% plot(mu1(:,1),mu1(:,2),'r+','LineWidth',2,'MarkerSize',7);
% hold off;

myKmeans.m

function [cx,cost] = myKmeans(K,data,num)
% 生成将data聚成K类的最佳聚类
[cx,cost] = kmeans1(K,data);
for i = 2:num
[cx1,min] = kmeans1(K,data);
if min<cost
cost = min;
cx = cx1;
end
end
% plotMeans(data,cx,K);
end function [cx,cost] = kmeans1(K,data)
%KMEANS 把数据集data聚成K类
% [cx,cost] = kmeans(K,data)
% K为聚类数目,data为数据集
% cx为样本所属聚类,cost为此聚类的代价值
% 选择需要聚类的数目 % 随机选择聚类中心
centroids = data(randperm(size(data,1),K),:);
% 迭代聚类
centroids_temp = zeros(size(centroids));
num = 0;
while (~isequal(centroids_temp,centroids)&&num<20)
centroids_temp = centroids;
[cx,cost] = findClosest(data,centroids,K);
centroids = compueCentroids(data,cx,K);
num = num+1;
end
cost = cost/size(data,1); end function [cx,cost] = findClosest(data,centroids,K)
% 将样本划分到最近的聚类中心
cost = 0;
n = size(data,1);
cx = zeros(n,1);
for i = 1:n
[M,I] = min(sum((centroids-data(i,:))'.^2));
cx(i) = I;
cost = cost+M;
end end function centroids = compueCentroids(data,cx,K)
% 计算新的聚类中心
centroids = zeros(K,size(data,2));
for i = 1:K
centroids(i,:) = mean(data(cx==i,:));
end
end

bestKmeans.m

function [num,cx] = bestKmeans(data,m,n)
% 返回数据集的最佳聚类数目与聚类结果
% data为数据集,m为寻找的最大聚类数量,n为每次聚类寻找次数
% 返回num最佳聚类数量,cx聚类结果。
costs = zeros(m,1)';
for i = 1:m
[~,cost] = myKmeans(i,data,n);
costs(i) = cost;
fprintf('最小代价值为:%.4f\n',cost);
end
costs = costs./costs(2)*m;
% 绘制拐点图
X = (1:m)';
X = [X,costs']; plot(X(2:m,1),X(2:m,2),'ko','MarkerFaceColor','y','MarkerSize',2);
title('Inflection point map');
% 寻找最佳聚类
min = -1;
for i = 3:m
x1 = X(2,:)-X(i,:);
x2 = X(m,:)-X(i,:);
k = x1*x2'/((x1*x1')*(x2*x2'));
if k>min&&k<0
num = i;
min = k;
end
end
% fprintf('聚类结果为:%d\n',num);
[cx,~] = myKmeans(num,data,n);
end

plotMeans.m

function [] = plotMeans(data,cx,K)
% 可视化数据聚类效果
figure;
color='cbygmkr';
hold on;
for i = 1:K
px = find(cx==i);
plot(data(px,1),data(px,2),'ko','MarkerFaceColor',color(i),'MarkerSize',5);
end
title('K-means')
hold off;
end

Main.m

% 主函数

% 生成符合高斯分布的数据
mu = [5,5];
sigma = [16,0;0,16];
sigma1 = [0.5,0;0,0.5];
data = gaussianSample(4,50,mu,sigma,sigma1); % 计算最佳聚类数量与结果
[num,cx] = bestKmeans(data,10,10);
fprintf('聚类结果为:%d\n',num);
plotMeans(data,cx,num);

执行Main.m代码,自动检测最佳聚类数目。结果如图

K-means聚类算法MATLAB的更多相关文章

  1. 密度峰值聚类算法MATLAB程序

    密度峰值聚类算法MATLAB程序 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 密度峰值聚类算法简介见:[转] 密度峰值聚类算法(DPC) 数据见:MATL ...

  2. k均值聚类算法原理和(TensorFlow)实现

    顾名思义,k均值聚类是一种对数据进行聚类的技术,即将数据分割成指定数量的几个类,揭示数据的内在性质及规律. 我们知道,在机器学习中,有三种不同的学习模式:监督学习.无监督学习和强化学习: 监督学习,也 ...

  3. K均值聚类算法

    k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个 ...

  4. 机器学习实战---K均值聚类算法

    一:一般K均值聚类算法实现 (一)导入数据 import numpy as np import matplotlib.pyplot as plt def loadDataSet(filename): ...

  5. K均值聚类算法的MATLAB实现

    1.K-均值聚类法的概述    之前在参加数学建模的过程中用到过这种聚类方法,但是当时只是简单知道了在matlab中如何调用工具箱进行聚类,并不是特别清楚它的原理.最近因为在学模式识别,又重新接触了这 ...

  6. 基于改进人工蜂群算法的K均值聚类算法(附MATLAB版源代码)

    其实一直以来也没有准备在园子里发这样的文章,相对来说,算法改进放在园子里还是会稍稍显得格格不入.但是最近邮箱收到的几封邮件让我觉得有必要通过我的博客把过去做过的东西分享出去更给更多需要的人.从论文刊登 ...

  7. K-medodis聚类算法MATLAB

    国内博客,上介绍实现的K-medodis方法为: 与K-means算法类似.只是距离选择与聚类中心选择不同. 距离为曼哈顿距离 聚类中心选择为:依次把一个聚类中的每一个点当作当前类的聚类中心,求出代价 ...

  8. K-modes聚类算法MATLAB

    K-modes算法主要用于分类数据,如 国籍,性别等特征. 距离使用汉明距离,即有多少对应特征不同则距离为几. 中心点计算为,选择众数作为中心点. 主要功能: 随机初始化聚类中心,计算聚类. 选择每次 ...

  9. 谱聚类算法—Matlab代码

    % ========================================================================= % 算 法 名 称: Spectral Clus ...

随机推荐

  1. 随机算法 - HNU 13348 Finding Lines

    Finding Lines Problem's Link: http://acm.hnu.cn/online/?action=problem&type=show&id=13348&am ...

  2. iBATIS SQL Maps

    让我们重回到车辆管理系统和张三的故事中. 在 iBATIS SQL Maps 的世界里也存在 one-to-many.many-to-one 的关系,想必你已经对这些概念驾轻就熟了.好!还是每个 Pe ...

  3. .NET Entity Framework(EF)使用SqlQuery直接操作SQL查询语句或者执行过程

    Entity Framework是微软出品的高级ORM框架,大多数.NET开发者对这个ORM框架应该不会陌生.本文主要罗列在.NET(ASP.NET/WINFORM)应用程序开发中使用Entity F ...

  4. 查看SQLServer数据库每个表占用的空间大小

    创建存储过程: CREATE PROCEDURE [dbo].[sys_viewTableSpace] AS BEGIN SET NOCOUNT ON; CREATE TABLE [dbo].#tab ...

  5. 《Programming with Objective-C》第四章 Encapsulating Data

    Designated Initializer 不稳定的传送门 合成属性 Properties don’t always have to be backed by their own instance ...

  6. ChemDraw使用不了怎么办

    ChemDraw作为一款专业级的化学绘图软件,不仅可以帮助用户绘制图像在数据计算方面也起了很大作用,因此,ChemDraw非常受用户的欢迎.但是我们在使用过程中难免会遇到各种问题,特别是对于新手用户, ...

  7. iOS开发之--当遇到tableView整体上移时的解决方案

    方案一在使用了navigationController后,当界面进行跳转往返后,时而会出现tableView上移的情况,通常会自动上移64个像素,那么这种情况,我们可以关闭tableView的自动适配 ...

  8. 【BZOJ4636】蒟蒻的数列 STL

    [BZOJ4636]蒟蒻的数列 Description 蒟蒻DCrusher不仅喜欢玩扑克,还喜欢研究数列 题目描述 DCrusher有一个数列,初始值均为0,他进行N次操作,每次将数列[a,b)这个 ...

  9. 如何用原生js替换字符串中的某个字符(或字符串)为指定的字符串?

    <html> <head><title>我的第一个 HTML 页面</title></head><script type=" ...

  10. Java使用BigDecimal解决浮点型运算丢失精度的问题

    @Test public void test1(){ System.out.print(0.05+0.01); } @Test public void test2(){ BigDecimal b1 = ...