matlab编程实现k_means聚类(k均值聚类)
1. 聚类的定义
以下内容摘抄自周志华《机器学习》
根据训练数据是否拥有标记信息,机器学习任务可以大致分为两大类:“监督学习”(supervised learning)和“无监督学习”(unsupervised learning)。分类和回归是监督学习的代表,而聚类则是无监督学习的代表。
聚类试图将数据集中的样本划分为若干个通常是不相交的子集,每个子集称为一个“簇”(cluster),通过这样的划分,每个簇可能对应一些潜在的概念(类别),而这些类别概念相对于聚类算法而言,事先是未知的,聚类过程只能自动形成簇结构,簇所对应的概念语义需由使用者来把握和命名。
2. k_means聚类原理
k_means聚类流程图如下
3. k_means聚类函数代码
function T = k_means(data, m, num, e)
% 本函数用于k_means聚类
% 输入data为聚类数据,每行一个数据点
% 输入m为簇的数量
% 输入num为最大迭代次数
% 输入e为阈值,指标为质心距离矩阵的迹,即更新前后质心距离之和
% 输出T为数据对应的类别号组成的序列
% 输出文件'.\centroid.txt',记录迭代次数及每次迭代的各类质心变化情况% 数据维数
datadim = length(data(1, :));
% 总数据量
n = length(data(:, 1));
% 定义类别标记列表
T = zeros(n, 1);% 得到初始m个质心
r = randperm(n, m);
C0 = rand(m, datadim);
for k = 1 : mC0(k, :) = data(r(k), :);
end
C1 = zeros(m, datadim);
Num = 0;% 打开文件
file = fopen('.\centroid.txt', 'wt');
%将写入指针移动至文章的开头
frewind(file);
% 如果两组质心之间的距离矩阵的迹仍大于阈值e,并且迭代次数没超过num,则进行循环
if file > 0while (trace(pdist2(C0, C1)) > e) && (Num <= num)for i = 1 : nmind = pdist2(data(i, :), C0(1, :));for j = 1 : mif pdist2(data(i, :), C0(j, :)) <= mindT(i) = j;mind = pdist2(data(i, :), C0(j, :));endendend% 更新质心C1 = C0;fprintf(file, '%d\n', Num);for j = 1 : mfor k = 1 : datadimfprintf(file, '%f,\t', C0(j, k));C0(j, k) = mean(data(T==j, k));endfprintf(file, '\n');endNum = Num + 1;endfclose(file);
end
主函数:
% model_class = 3;
% dim = 3;
% % 期望值
% m = [0, 0, 0;
% 2, 2, 2;
% -2, -2, -2];
% % 协方差阵
% s(:, :, 1) = [0.2, 0, 0;
% 0, 0.2, 0;
% 0, 0, 0.2];
% s(:, :, 2) = [0.5, 0, 0;
% 0, 0.5, 0;
% 0, 0, 0.5];
% s(:, :, 3) = [0.5, 0, 0;
% 0, 0.5, 0;
% 0, 0, 0.5];
%
% num = [5000, 5000, 5000];
% data = generate_data_GMM(dim, model_class, m, s, num);
iris = load('iris.txt');
data = iris(:, (1:4));
T = k_means(data, 3, 30, 0.05);
注:主函数给了两个例子,一个是基于高斯分布数据,一个是基于鸢尾花测试数据。这里高斯分布数据用到了笔者自编写的generate_data_GMM函数,这个函数详细说明及代码请查看:
matlab生成多组多维高斯分布数据
4. 其他说明
- k_means聚类算法简单,学聚类第一个接触的聚类算法几乎都是k_means聚类。k_menas聚类有两大重要的缺点:
其一:需要知道聚类的类别数量
其二:可能收敛到局部最优解
但是类别的数量有方法可以估计出来,估计方法这里不在赘述,读者可查阅其他资料。在不需要实时应用时,也可以多次尝试选择最佳聚类数量。局部最优的情况也可以通过多次聚类来弥补。所以k_means聚类的特点可以归纳为:简单,但是一般够用。 - 本函数中使用了欧拉距离作为距离的度量,也可以选择其他距离,更改函数代码中的pdist2函数的距离参数即可。
matlab编程实现k_means聚类(k均值聚类)相关推荐
- 图像聚类-K均值聚类
最近做的一个东西跟这个相关,本来希望是用深度学习对于没有标签的图像数据进行分类,但是通常情况下,深度学习是对有标签的数据进行学习,目的是用来自动提取特征,代替传统的手工提取特征.因此,比较容易想到,对 ...
- 使用遗传算法和模拟退火改进的K均值聚类
1.摘要 聚类问题可以转化为对准则函数的最优化求值问题.常见的K均值聚类算法对初值敏感,容易陷入局部最优,特别是对于分界面模糊的样本聚类能力较差. 遗传算法可以在全局上随机搜索最优解,因此将聚类问题转 ...
- Python,OpenCV中的K均值聚类——K-Means Cluster
Python,OpenCV中的K均值聚类 1. 效果图 2. 原理 2.1 什么是K均值聚类? 2.2 K均值聚类过程 2.3 cv2.kmeans(z, 2, None, criteria, 10, ...
- EM算法应用:k均值聚类(k-means)和高斯混合模型(GMM)
文章目录 k-means聚类 EM角度的理解 算法流程 特点 k值选择 局限性 高斯混合模型 GMM的问题描述 1,明确隐变量 2.EM算法的E步:确定Q函数 3. EM算法的E步 4. 停止条件 上 ...
- 多元统计分析--聚类分析(系统性聚类、K均值聚类)
摘要 系统聚类分为Q型聚类与R型聚类.前者对样品进行聚类,后者对变量进行聚类.在本文中,我们探讨对样品的分类. 文章目录 摘要 主要思想 相似性的度量 系统聚类 K均值聚类 主要思想 聚类,在样品没有 ...
- 非监督学习: K 均值聚类(原理、步骤、优缺点、调优)
支持向量机.逻辑回归.决策树等经典的机器学习算法主要用于分类问题,即根据一些己给定类别的样本, 训练某种分类器,使得它能够对类别未知的样本进行分类.与分类问题不同,聚类是在事先并不知道任何样本类别标签 ...
- K均值聚类算法的MATLAB实现
K均值聚类算法的MATLAB实现 1.K-均值聚类法的概述 之前在参加数学建模的过程中用到过这种聚类方法,但是当时只是简单知道了在matlab中如何调用工具箱进行聚类,并不是特别清楚它的原理.最近因为 ...
- K均值聚类关于初始聚类中心的探讨(matlab程序)
对应之前发过的:K均值聚类关于初始聚类中心的探讨,补发MATLAB的程序代码. matlab程序: 1. %利用传统K均值随机选取点聚类 clear all; close all; clc; %生成五 ...
- 聚类分析 | MATLAB实现k-Means(k均值聚类)分析
目录 聚类分析 | MATLAB实现k-Means(k均值聚类)分析 k-均值聚类简介 相关描述 程序设计 学习小结 参考资料 致谢 聚类分析 | MATLAB实现k-Means(k均值聚类)分析 k ...
- K均值聚类以及matlab实现
K均值聚类是最基础的一种聚类方法.K均值聚类,就是把看起来最集中.最不分散的簇标签分配到输入训练样本里.具体而言,通过下式计算簇y的分散情况. 在这里,表示的是满足的y的和. 上式的为簇y的中心,为属 ...
最新文章
- HDU 1155 Bungee Jumping
- 多层 UIScrollView 嵌套滚动解决方案
- 队列表mysql,什么是在mysql中实现消息队列表的最佳方法
- 11 | 套路篇:如何迅速分析出系统CPU的瓶颈在哪里?
- ActiveMQ的几种集群配置
- spring集成 log4j + slf4j
- DeFi借贷协议Liquity宣布主网将于4月5日上线
- 【实用工具】GLIBC降级
- 基本的Material Design布局结构
- 虚拟串口 VSPD 的使用
- Tomcat,jsp中文乱码问题解决
- 安卓获取浏览器上网记录_Android 获取自带浏览器上网记录
- GCC源码分析(摘)
- 计算机画图调整画笔粗细,【2人回答】画图里画笔怎么加粗-3D溜溜网
- 如何使用rclone从AWS S3迁移到IBM COS - part 2 - 同步腾讯云对象存储
- C primer plus(第六版)第五章源代码
- 跨境电商的9大运营模式
- 金誉半导体:MOS管耗尽型和增强型是什么意思?
- Quartz2D学习记录
- 苹果消息推送服务教程:第2部分(共2部分)