kmeans之于模式识别,如同“hello world”之于C、之于任何一门高级语言。

算法的规格(specification)

在聚类问题(一般非监督问题)中,给定训练样本X={x(1),x(2),…,x(N)}\mathcal X = \{x^{(1)},x^{(2)}, \ldots , x^{(N)}\},每个x(i)∈Rdx^{(i)}\in \mathbb R^d。kmeans算法的职责在于将这NN个样本聚类成kk个簇(cluster, μ1,μ2,…,μk\mu_1,\mu_2,\ldots,\mu_k),流程如下:

  1. 随机选取kk个聚类中心(cluster centroids)为μ1,μ2,…,μk\mu_1,\mu_2,\ldots,\mu_k
    C = X(randperm(m*n, k), :); # 程序语言

  2. 重复一下过程直至收敛
    {
    对于每一个样本ii,根据最近邻(欧氏距离度量)计算其所属分类

    c(i):=argminj∥x(i)−μj∥2

    c^{(i)}:=\arg\min_j\|x^{(i)}-\mu_j\|^2
    对于每一个类jj,重新计算该类的质心(centroids)

    μj:=∑mi=11{c(i)=j}x(i)∑mi=11{c(i)=j}

    \mu_j := \dfrac {\sum_{i=1}^m 1\{c^{(i)}=j\}x^{(i)}} {\sum_{i=1}^m1\{c^{(i)}=j\}}
    }

算法的规格:

  • 一个参数kk,聚类中心的数目,当然也有一些常规的参数,比如最大迭代次数epochsepochs,容忍度toltol
  • 一个循环,判断目标函数是否变化足够小,以FF范数(Frobenius norm)为度归。
while true,...if norm(J_cur-J_prev, 'fro') < tol,break;endJ_prev = J_cur;
end
  • 一条更新语句,更新各个类的聚类中心,根据每个样本应属的类别(欧式距离最小表征)
μj:=∑mi=11{c(i)=j}x(i)∑mi=11{c(i)=j}

\mu_j := \dfrac {\sum_{i=1}^m 1\{c^{(i)}=j\}x^{(i)}} {\sum_{i=1}^m1\{c^{(i)}=j\}}

这个公式看似高大上,实则不值一提,翻译过来就是新的聚类中心(centroid)在该类别空间的中心处。

    dist = sum(X.^2, 2)*ones(1, k) + (sum(C.^2, 2)*ones(1, m*n))'...- 2*X*C';[~, idx] = min(dist, [], 2) ;for i = 1:k,C(i, :) = mean(X(idx == i , :)); # 对应于这样一条语句end

matlab实现

客户端(client)程序

clear all; close all;
I = imread('./lena.bmp');
[m, n, p] = size(I);
k = 7;
[C, label, J] = kmeans(I, k);
I_seg = reshape(C(label, :), m, n, p);
figure
subplot(1, 2, 1), imshow(I, []), title('原图')
subplot(1, 2, 2), imshow(uint8(I_seg), []), title('聚类图')
figure
plot(1:length(J), J), xlabel('#iterations')

kmeans函数

function [C, label, J] = kmeans(I, k)
[m, n, p] = size(I);
X = reshape(double(I), m*n, p);
rng('default');
C = X(randperm(m*n, k), :);
J_prev = inf; iter = 0; J = []; tol = 1e-2;
while true,iter = iter + 1;dist = sum(X.^2, 2)*ones(1, k) + (sum(C.^2, 2)*ones(1, m*n))' - 2*X*C';[~, label] = min(dist, [], 2) ;for i = 1:k,C(i, :) = mean(X(label == i , :));endJ_cur = sum(sum((X - C(label, :)).^2, 2));J = [J, J_cur];display(sprintf('#iteration: %03d, objective fcn: %f', iter, J_cur));if norm(J_cur-J_prev, 'fro') < tol,break;endJ_prev = J_cur;
end

实验结果

目标函数收敛情况

目标函数

J(c,μ)=∑i=1m∥x(i)−μc(i)∥2

J(c, \mu)=\sum_{i=1}^m\|x^{(i)}-\mu_c(i)\|^2
matlab计算程序:

J_cur = sum(sum((X - C(label, :)).^2, 2));

效果图

模式识别经典算法——Kmeans图像聚类分割(以最短的matlab程序实现)相关推荐

  1. 模式识别经典算法——FCM图像聚类分割(最简matlab实现)

    算法的规格 算法的记号及参数 记号 更新公式 算法的流程 数学语言与程序语言 算法的实现matlab 客户端程序 FCM函数 效果演示 敛散性分析 聚类分割效果图 避免出现局部极小值的方法 从kmea ...

  2. matlab图像定位分割,車牌定位matlab程序:通過hsv彩色分割方式定位車牌

    最近看了<基於數字圖像處理的車牌識別研究>這篇論文,對車牌識別知識講的很仔細,推薦. 1.(摘自<基於數字圖像處理的車牌識別研究>) 通過對大量車牌圖像的分析,可以發現對於具有 ...

  3. 【图像分割】萤火虫算法图像聚类分割【含Matlab源码 2106期】

    ⛄一.萤火虫算法图像聚类分割简介 1 萤火虫算法的基本原理 1.1 萤火虫算法的数学表述 根据萤火虫算法的仿生原理,萤火虫算法的数学描述如下,萤火虫个体的相对发光强度可由式(2)确定 式中:rij为萤 ...

  4. 【图像分割】基于matlab萤火虫算法图像聚类分割【含Matlab源码 2106期】

    ⛄一.萤火虫算法图像聚类分割简介 1 萤火虫算法的基本原理 1.1 萤火虫算法的数学表述 根据萤火虫算法的仿生原理,萤火虫算法的数学描述如下,萤火虫个体的相对发光强度可由式(2)确定 式中:rij为萤 ...

  5. (学习笔记)十大经典算法——K-means聚类算法

    概述 聚类算法是在无监督的情况下将对象自动分组的一种分析方法,典型的聚类算法分为三个阶段:特征选择和特征提取,数据对象间相似度计算,根据相似度将数据对象分组.聚类算法的目标是将数据集合分成若干簇,使得 ...

  6. 基于KMeans聚类的协同过滤推荐算法推荐原理、过程、代码实现 Canopy聚类算法 KMeans+Canopy聚类算法 聚类算法程序实现 KMEans聚类算法代码java

    基于KMeans聚类的协同过滤推荐算法可运用于基于用户和基于项目的协同过滤推荐算法中,作为降低数据稀疏度和提高推荐准确率的方法之一,一个协同过滤推荐过程可实现多次KMeans聚类. 一.基于KMean ...

  7. 图像语义分割样本制作——使用Matlab模块Image Labeler 标记样本

    在进行图像语义分割的时候,需要自己制作数据集,目前开源的标记软件很多,但个人觉得最好用的还是MATLAB中的Image Labeler,下面是简单的使用介绍. 1. 定义各类别说明: 2. 工具栏介绍 ...

  8. K均值聚类关于初始聚类中心的探讨(matlab程序)

    对应之前发过的:K均值聚类关于初始聚类中心的探讨,补发MATLAB的程序代码. matlab程序: 1. %利用传统K均值随机选取点聚类 clear all; close all; clc; %生成五 ...

  9. 最大最小距离算法(K-MEANS K-medoids )聚类算法的结合运用

    聚类算法通常会得到一种分类,将n个点聚合成k类,同一聚类(即插槽簇)中的对象相似度较高:而不同类中的对象相似度较小. 聚类算法的基本流程如下: (1)从n个节点中选择 k 个节点作为初始聚类中心.(2 ...

最新文章

  1. 【数据挖掘】贝叶斯公式应用 拼写纠正示例分析 ( 先验概率 | 似然概率 | 后验概率 )
  2. 如何使用窗体开发-理解那些函数怎么来的?
  3. 编程语言中常见数据结构
  4. POJ1265(Pick定理的应用)
  5. 类5-类的继承、虚函数、纯虚函数、虚析构函数
  6. 史上最可爱的关系抽取指南?从一条规则到十个开源项目
  7. ASP.NET MVC教程六:两个配置文件详解
  8. 安卓固件修改工具_【固件升级】给力!安卓6.0以上设备均已升级BOOX OS 2.3系统...
  9. easyui前端实现多选框_在实际案例中学习前端开发(第二期)
  10. python个人所得税怎么写_Python实现的个人所得税计算器示例
  11. y53拆机视频教程_戴尔笔记本P35G拆机全过程图解
  12. python常用代码
  13. Access denied for user ‘‘@‘localhost‘ (using password: YES)报错原因分享
  14. pandas.plotting.scatter_matrix 参数
  15. Hacking Vim: 插件管理器Pathogen(02)
  16. 华为鸿蒙系统有没有畅玩7c,华为荣耀畅玩7C有什么新功能
  17. 项目管理工具DHTMLX Gantt灯箱元素配置教程:配置灯箱元素
  18. Office2016、visio2016安装的注意事项
  19. 小程序自定义导航栏组件
  20. Intent传递Bitmap

热门文章

  1. Apache MiNa 2 学习笔记
  2. 安装Ubuntu下的开发工具
  3. 安装JDK失败,再次安装时出现已经安装过了的,解决办法
  4. Kerberos安装
  5. Phoenix命令及语法
  6. Theme相关:button的效果不显示
  7. LeetCode 145. 二叉树的后序遍历(递归)(迭代)(颜色标记法)
  8. 海思3519A上运行yolov3(二)——Linux和Windows开发环境和运行环境搭建
  9. Redis教程:基础知识
  10. ADO.NET 2.0 功能一览