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函数的距离参数即可。
相关文章:

一目了然了解JAVA集合体系
在编程中,常常需要集中存放多个数据。从传统意义上讲,数组是我们的一个很好的选择,前提是我们事先已经明确知道我们将要保存的对象的数量。一旦在数组初始化时指定了这个数组长度,这个数组长度就是不可变的,如果我们需…

杭电1175简单搜索 连连看
连连看 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 34807 Accepted Submission(s): 8657 Problem Description “连连看”相信很多人都玩过。没玩过也没关系,下面我给大家介绍一下游戏规则&#…

IOS专栏目录
IOS 专栏目录 iOS基础篇 iOS高级篇 ios架构篇-1 项目组织架构 ios架构篇-2 国际化多语言 iOS架构篇-3 网络接口封装 iOS架构篇-4 架构模式MVVM iOS架构篇-5 CI/CD(持续集成、持续交付、持续部署) iOS专题1-蓝牙扫描、连接、读写 iOS 直播专题1-直播流程原理 iOS 直播专题2-…

CV03-双线性差值pytorch实现
一、双线性差值 1.1 公式 在理解双线性差值(Bilinear Interpolation)的含义基础上,参考pytorch差值的官方实现注释,自己实现了一遍。 差值就是利用已知点来估计未知点的值。一维上,可以用两点求出斜率,再…

matlab编程实现基于密度的聚类(DBSCAN)
1. DBSCAN聚类的基本原理 详细原理可以参考链接: https://www.cnblogs.com/pinard/p/6208966.html 这是找到的相对很详细的介绍了,此链接基本仍是周志华《机器学习》中的内容,不过这个链接更通俗一点,且算法流程感觉比《机器学习…

EAST 自然场景文本检测
自然场景文本检测是图像处理的核心模块,也是一直想要接触的一个方面。刚好看到国内的旷视今年在CVPR2017的一篇文章:EAST: An Efficient and Accurate Scene Text Detector。而且有开放的代码,学习和测试了下。 题目说的是比较高效࿰…

通过httpmodule获取webapi返回的信息
我写了一个webapi,想在module中获取请求的信息和返回的信息,写进log里,以方便以后查询。request信息很容易能拿到,但是返回信息得费一番周折。不多说,上代码 public class ResponseLoggerModule : IHttpModule {privat…

iOS SwiftUI篇-2 UI控件 Text Button Image List
iOS SwiftUI篇-2 UI控件 Text Button Image List Text 显示文本,相当于UILabel import SwiftUIstruct TextContentView: View {var body: some View {//VStack(垂直排列视图)可以将其内部的多个视图,在垂直方向进行等距排列,VStack最多可以容纳十个子视图,VStack(spacin…

numpy和torch数据操作对比
对numpy和torch数据操作进行对比,避免遗忘。 ndarray和tensor import torch import numpy as npnp_data np.arange(6).reshape((2, 3)) torch_data torch.arange(6) # 张量 tensor2array torch_data.numpy()print(\nnumpy array:\n, np_data,\ntorch tensor\n,…

ZooKeeper学习
一、ZooKeeper 的实现 1.1 ZooKeeper处理单点故障 我们知道可以通过ZooKeeper对分布式系统进行Master选举,来解决分布式系统的单点故障,如图所示。 那么我们继续分析一下,ZooKeeper通过Master选举来帮助分布式系统解决单点故障, 保…

iOS SwiftUI篇-1 项目结构
iOS SwiftUI篇-1 项目结构 介绍Xcode新建的SwiftUI模版项目结构、跟普通Storyboard模版项目的差异、SwiftUI项目的app启动流程、UIScene概念介绍、AppDelegate.swift和Info.plist的差异 1.项目模版 Interface: SwiftUI Life Cycle: UIKit App Delegate Language: Swift Life…

js绑定事件和解绑事件
在js中绑定多个事件用到的是两个方法:attachEvent和addEventListener,但是这两个方法又存在差异性 attachEvent方法 只支持IE678,不兼容其他浏览器addEventListener方法 兼容火狐谷歌,不兼容IE8及以下 addEventListener方法 div.addEventListener(click,fn); div.addEventLi…

基于三维点云数据的主成分分析方法(PCA)的python实现
主成分分析(PCA)获取三维点云的坐标轴方向和点云法向量 # 实现PCA分析和法向量计算,并加载数据集中的文件进行验证import open3d as o3d # import os import numpy as np from scipy.spatial import KDTree# from pyntcloud import PyntClo…

CV02-FCN笔记
目录 一、Convolutionalization 卷积化 二、Upsample 上采样 2.1 Unpool反池化 2.2 Interpolation差值 2.3 Transposed Convolution转置卷积 三、Skip Architecture 3.1 特征融合 3.2 裁剪 FCN原理及实践,记录一些自己认为重要的要点,以免日后遗…

python基础之常用模块
6、TEXT PROCESSING SERVICES :文本处理服务 6.1、re 8、DATA TYPES : 数据类型 8.1、datetime 8.2、collections 8.3、copy 9、 NUMERIC AND MATHEMATICAL MODULES : 数字和数学模块 9.1、random 10、FUNCTIONAL PROGRAMMING MODULES : 函数式编程模块 10.1、iter…

笔记本电脑摄像头实现光流跟踪
看实验室里的师兄在写CSDN,自己也写一个,记录自己的学习进程吧。 研究生从机械转到了毫无基础的SLAM领域。研一半年上课加自学,对SLAM也有一丢丢的了解。最近看光流法时,想到用笔记本电脑的摄像头实现一下,就简单的…

JSON字符串 拼接与解析
常用方式: json字符串拼接(目前使用过两种方式): 1.运用StringBuilder拼接 StringBuilder json new StringBuilder(); json.append("{"); json.append(""uuid":" """ uuid "",&q…

iOS SwiftUI篇-3 排版布局layout
iOS SwiftUI篇-3 排版布局layout swiftUI提供的layout有: ZStack、GeometryReader、HStack、LazyVGrid、LazyHStack、LazyHGrid、LazyVStack、VStack、Spacer、ScrollViewReader等 HStack 水平横向布局容器,子view按顺序水平排列 HStack(alignment: .center, spacing: 10)…

CV04-UNet笔记
目录 一、UNet模型 二、Encoder & Decoder 2.1 Encoder 2.2 Decoder 2.3 classifier 学习U-Net: Convolutional Networks for Biomedical Image Segmentation,记录一些自己认为重要的要点,以免日后遗忘。 代码:https://github.com/…

Scrapy 学习笔记(-)
Scrapy Scrapy 是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中。其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 A…

Ubuntu18.04运行ORB_SLAM2
运行环境:Ubuntu18.04 预先安装的库 需要预先安装一些库,如Eign,Sophus,OpenCV等。笔者在阅读《SLAM十四讲》的时候已经安装,在此不再赘述。 ORB_SLAM2源码的下载与编译 git clone https://github.com/raulmur/ORB…

java中的各种流(老师的有道云笔记)
内存操作流-字节之前的文件操作流是以文件的输入输出为主的,当输出的位置变成了内存,那么就称为内存操作流。此时得使用内存流完成内存的输入和输出操作。如果程序运行过程中要产生一些临时文件,可采用虚拟文件方式实现;直接操作磁…

iOS SwiftUI篇-4 注解@State、@Binding、@ObservedObject、@EnvironmentObject、@Environment
iOS SwiftUI篇-4 注解@State、@Binding、@ObservedObject、@EnvironmentObject、@Environment @State 关联View的状态,当@State修饰的属性改变时,对应的View会跟着刷新,符合MVVM的设计理念 @State var count: Int = 0Section(header: Text("@States")) {Te
CV05-ResNet笔记
目录 一、为什么是ResNet 二、Residual Learning细节 2.1 shortcut计算 2.2 11卷积调整channel维度大小 2.3 ResNet层数 2.4 ResNet里的Basic Block 和 Bottleneck Block 2.5 Global Average Pooling 全局平均池化 2.6 Batch Normalization 学习ResNet,记录…

二叉树的前序,中序,后序的递归、迭代实现
二叉树的前序遍历 递归实现 递归实现没什么好说的。个人感觉将函数功能看成一个整体,不要去想栈中怎么实现的。毕竟自己的脑袋不是电脑,绕着绕着就蒙了。 void preordered_traversal_recursion(TreeNode* root) {if(root NULL) return;container.pus…

DataSet 动态添加列
public DataSet GetNewId(List<string> IdArr){DataSet ds new DataSet();DataTable newtb new DataTable();DataColumn column new DataColumn("cnt", typeof(string));//新增列newtb.Columns.Add(column);for (int i 0; i < IdArr.Count; i){StringBu…

iOS专题1-蓝牙扫描、连接、读写
iOS专题1-蓝牙扫描、连接、读写 概念 外围设备 可以被其他蓝牙设备连接的外部蓝牙设备,不断广播自身的蓝牙名及其数据,如小米手环、共享单车、蓝牙体重秤 中央设备 可以搜索并连接周边的外围设备,并与之进行数据读写通讯,如手机 日常生活中常见的场景是手机app通过蓝…

CV06-Xception笔记
目录 一、为啥是Xception 二、Xception结构 2.1 Xception结构基本描述 2.2 实现细节 2.3 DeepLabV3改进 三、记录pytorch采坑relu激活函数inplaceTrue Xception笔记,记录一些自己认为重要的要点,以免日后遗忘。 复现Xception论文、DeepLabV改进的…

C++排序算法实现(更新中)
比较排序法:如冒泡排序、简单选择排序、合并排序、快速排序。其最优的时间复杂度为O(nlogn)。 其他排序法:如桶排序、基数排序等。时间复杂度可以达到O(n)。但试用范围有要求。 桶排序:排序的数组元素跨距不能很大。因为跨距很大的话…

iOS SwiftUI篇-5 专题NavigationView、NavigationLink
iOS SwiftUI篇-5 专题NavigationView、NavigationLink NavigationView:标题、展示模式、隐藏导航栏、隐藏返回按钮、添加导航栏按钮 NavigationLink:Text文本跳转、Image图片跳转、Button按钮跳转、点击按钮根据业务跳转到不同页面 NavigationView 标题、展示模式 import S…