KMeans聚类分析星

1. datasample

initial_centroids = datasample(data, k, 'Replace', false);

是MATLAB中的命令,用于从数据集data中随机抽取k个样本作为初始聚类汇总新,并且抽取时不放回。

  • datasample:是MATLAB中的函数,用于从数组中随机抽取样本
  • data:是你想要进行聚类分析的数据集,通常是包含了所有待分类样本特征的矩阵
  • k:表示希望创建的聚类数量。在K-means算法中,这是个关键参数,需要实现确定。
  • 'Replace', false:这个参数指定了抽样的方式。当设置为false时,意味着每个样本在一次抽样中只能被选中一次,即不放回抽样。这对于确保初始聚类中心之间的独立性是有益的。
function [centroids, idx] = runKMeans(X, initial_centroids, max_iters)% 获取样本数和特征数[m, n] = size(X);% 获取聚类中心数k = size(initial_centroids, 1);% 初始化变量centroids = initial_centroids;previous_centroids = centroids;idx = zeros(m, 1);% 运行 K-meansfor i = 1:max_iters% 聚类分配步骤idx = findClosestCentroids(X, centroids);% 更新聚类中心centroids = computeCentroids(X, idx, k);% 如果聚类中心变化很小,则停止迭代if isequal(previous_centroids, centroids)break;endprevious_centroids = centroids;end
end

以上定义了一个名为runKMeans的函数,它接受三个输入参数:样本数据矩阵X、初始聚类中信initial_centroids和最大迭代次数max_iters。该函数输出两个变量:最终的聚类中心centroids和每个样本所属的聚类索引idx。

2.size()

[m, n] = size(X);

k = size(initial_centroids, 1);

  • 获取尺寸:计算输入样本矩阵X的行数(样本数)和列数(特征数)n
  • 确定聚类数:通过计算initial_centroids的行数来得到聚类中心的数量k

size()函数用于获取数组(包括但不限于矩阵、向量、多维数组等)的尺寸信息,它可以给返回数组的行数、列数、或是更高维度的大小。size函数的基本语法

size(A)

size(A, dim)

  • size(A):当不带第二个参数调用时,size()函数返回一个行向量,其中包含了数组A的各个维度的大小。对于最常见的二维数组(矩阵),它会返回一个包含两元素的行向量,第一个元素是行数,第二个元素是列数。对于一维数组(向量),它将返回一个单元素行向量,表示该向量的长度。
  • size(A, dim):如果指定了第二个参数dim,则size函数只返回数组A在指定维度dim上的大小。在MATLAB中,维度编号从1开始。例如,size(A, 1)返回数组的行数,size(A, 2)返回列数。对于更高维度的数组,dim可以是1到数组维数的最大值
1.一维向量

B = [1 2 3 4];

len = size(B);        % 返回 [4],表示长度为4

2.二维矩阵

A = [1 2; 3 4; 5 6];

sz = size(A);        %返回 [2 2],表示2行2列

rows = size(A, 1);        % 返回 2,表示行数

cols = size(A, 2);         % 返回 3,表示列数

3.三维数组

C = zeros(3, 4, 2);         %  创建一个3x4x2的三维数组

dims = size(C);              % 返回[3 4 2],表示三维数组的尺寸

depth = size(C, 3);         % 返回2,表示第三维的大小 

3.zeros()

centroids = initial_centroids;

previous_centroids = centroids;

idx = zeros(m, 1);

  • centroids:将初始聚类中心赋值给centroids,这是要迭代更新的变量
  • previous_centroids:用于存储上一次迭代的聚类中心,用于比较是否需要继续迭代
  • idx:初始化一个全为0的向量,用于记录每个样本点归属的聚类索引,长度等于样本数m。

在MATLAB中,zeros是一个用于创建全零数组(矩阵) 的函数,基本语法:

Z = zeros(size)

Z = zeros(sz1, ..., szN)

Z = zeros(sz, dim)

  1. Z = zeros(size):这是最简单的形式,其中size可以是一个标量、向量或者元胞数组(类似于结构体、对象、字典),用来指定输出数组的尺寸。如果size是一个标量,则创建一个 size x size的方阵;如果是一个向量,向量的元素分别代表数组的行数和列数,或更高维度大小。如果是元胞数组,根据元胞数组的内容生成对应尺寸的数组
  2. Z = zeros(sz1, ..., szN):这种形式允许直接指定数组的各维大小,例如zeros(3, 4)会创建一个3行4列的全零矩阵
  3. Z = zeros(sz, dim):这种形式中,sz定义了数组在除了维度dim以外的所有其他维度的大小,而dim指定的维度大小则是1.
4.findClosestCentroids()

idx = findClosestCentroids(X, centroids);

聚类分配:调用findClosestCentroids函数,该函数计算每个样本点距离所有聚类中心的距离,并为每个样本分配最近的聚类中心的索引,将结果存入idx。

function idx = findClosestCentroids(X, centroids)K = size(centroids, 1);idx = zeros(size(X,1), 1);% 计算每个样本点到各个聚类中心的距离for i = 1:size(X,1)distances = zeros(K, 1);for j = 1:Kdistances(j) = sum((X(i,:) - centroids(j,:)).^2);end% 找到最近的聚类中心[~, idx(i)] = min(distances);end
end
  • 传入参数
    • X:是一个二维数组(矩阵),其中的每一行代表一个数据点,每一列代表一个特征。
    • centroids:也是一个二维数组,每一行代表一个聚类中心,每一列对应一个特征维度。行数等于聚类的数量。
  • 工作流程
    • 初始化:为每个数据点初始化一个索引变量,准备记录它所归属的最近质心的索引。
    • 计算距离:遍历数据集中的每一个数据点,计算该点与每一个聚类中心之间的距离。
    • 找到最近得质心:对于每个数据点,找出距离最小得那个聚类中心,并记录下这个质心的索引
    • 返回索引向量:最后,函数返回一个向量(或数组),其中的每个元素对应X中的一个数据点,值为该点分配的聚类索引。 

distances(j) = sum((X(i,:) - centroids(j,:)).^2);

这行代码用来计算一个数据点到某个聚类中心得欧几里得距离得平方和

  • distances(j):这是用于存储第i个数据点到第j个聚类中心得距离平方和变量。distances是一个向量,每个元素对应一个聚类中心,最终会用来找到距离最近得聚类中心。
  • sum():是一个累加函数,用于计算括号内所有元素得总和
  • (X(i, :) - centroids(j, :):这部分是减法操作,它计算了数据X的第i行(代表第i个数据点的所有特征值)与聚类中信centroids的第j行(代表第j个聚类中心的的所有特征值)之间的差值。结果是一个向量,每个元素表示对应特征上的差值。
  • (...) .^ 2:这是对上述差值向量中的每个元素进行平方操作,即计算差值的平方。

综上所述,这行代码的完整意义是:对于数据点X中的第i个点,计算它与聚类中心centroids中第j个中心的每个特征值的差值,然后将这些差值各自平方,最后将这些平方差值相加起来可以得到距离的平方和,存储在distances(j)中。这样,通过遍历所有聚类中心,可以找到距离第i个数据点最近的聚类中心,并记录下该中心的索引。

[~, idx(i)] = min(distances);

这行代码用来找到数组中的最小值并同时获取其索引。

  • min(distances):这部分的作用是计算向量distances中的最小值。distances是一个向量,其中包含了数据点到各个聚类中心的距离。min()函数会遍历这个向量,找到其中的最小值。
  • [~, idx(i)]:这里使用了MATLAB的输出参数列表特性,允许你从一个函数中同时获取多个输出。波浪线~是一个特殊的占位符,表示你对该函数的某个输出不感兴趣,不需要保存。在本例中,min()函数默认会返回两个输出:最小值和对应的索引位置,但因为我们只需要索引,所以用~忽略了最小值。

综上所述,这行代码的完整意义是计算distances向量中的最小值,并将这个最小值对应的索引位置赋给向量的第i个元素。这意味着,对于每个数据点,它会找到距离最近的聚类中心的索引,并记录下来,以便后续分配该数据点到相应的聚类中。

5.computeCentroids(X, idx, K)
function centroids = computeCentroids(X, idx, K)[m, n] = size(X);centroids = zeros(K,n);% 对每个聚类计算新的聚类中心for i = 1:Kcentroids(i,:) = mean(X(idx == i,:));end
end  

这个函数用于计算K-means聚类算法中的新聚类中心。

function centroids = computeCentroids(X, idx, K)

  • centroids:输出参数,表示计算后的聚类中心矩阵,每一行对应一个聚类中心
  • X:输入参数,是一个二维矩阵,其中的每一行代表一个数据点,每一列代表一个特征。
  • idx:输入参数,是一个向量,长度与X的行数相同,表示每个数据点分配到的聚类索引
  • K:输入参数,表示聚类的数量

[m, n] = size(X);
centroids = zeros(K,n);

  • [m, n] = size(X):获取X的行数(样本数)m和列数(特征数)n
  • centroids = zeros(K, n):初始化一个K行n列的零矩阵,用于存放新的聚类中心

for i = 1:K
        centroids(i,:) = mean(X(idx == i, :));
    end

  • for i = 1:K:循环遍历每一个聚类(从1到K)
  • mean(X(idx == i, :):这里是关键步骤,idx == i 生成一个与X同形状的布尔矩阵,其中与第i类对应的数据点位置为真(非0),其余为假(零)。然后用这个布尔矩阵索引X,仅选取第i类的所有数据点。mean()计算这些数据点再每一列的平均值,即计算再第i类的质心在每个特征维度上的平均值
  • centroids(i, :) = ...:将计算得到的第i类的质心值赋给centroids矩阵的第i行,完成一个聚类中心的更新

综上所述,函数的主要作用是根据当前数据点到聚类的分配情况(由idx给出),重新计算每个聚类的中心(均值)。这是K-means算法中“更新聚类中心”步骤的实现,通过不断迭代这个过程,聚类中心会逐渐趋于稳定,直到满足停止条件(如质心移动距离小于阈值或达到迭代上限)。

1.mean(X(idx == i, :))生成布尔矩阵

在MATLAB中,像 idx == i 这样的表达式,它实际上是在执行一个元素的比较操作。这里的idx 和 i都是向量或者数组。表达式的运算结果会是一个与idx 和 i 形状相同的逻辑数组(也常被称为布尔矩阵),其中的每个元素是true或者false。例如:

idx = [1, 2, 3, 2, 1];

i = 2;

boolMatrix = idx == i;

执行上述代码后,boolMatrix 将会是[false, true, false, true, false];

mean(X(idx == i, :))工作流程:

  1. 生成布尔矩阵:首先,通过 idx == i 比较操作生成一个逻辑数组,该数组指示 X 中哪些行的索引匹配 i。

  2. 索引操作:然后,这个逻辑数组被用作 X 的行索引来选取数据。在 MATLAB 中,当你用一个布尔数组作为索引时,它会选择那些对应位置为 true的元素。所以 X(idx == i, :) 实际上选取了 X 中所有索引为 i 的行。

  3. 计算平均值:最后,mean 函数被应用到这些选中的行上,计算它们的平均值。这意味着你会得到一个标量结果,代表索引为 i 的所有行的平均值。

2.mean()函数

用于计算数组中元素的平均值

        1.一维数组

A = [1, 2, 3, 4, 5];

avg = mean(A);        % avg将会是3,因为(1+2+3+4+5)/5=3

         2.二维数组

(默认)沿着行方向操作,计算得到每一列的平均值

B = [1, 2; 3, 4; 5, 6];

colMeans = mean(B);        % colMeans将会是[3; 4],即每列的平均值

rowMeans = mean(B, 2);        % rowMeans将会是[1.5; 3.5; 5.5],即每行的平均值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/24686.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

halcon算子之prepare_object_model_3d详解

为某一操作准备三维对象模型。 Description 操作符prepare_object_model_3d准备3D对象模型ObjectModel3D,用于下面目的中给出的操作。它计算操作所需的值并将其存储在ObjectModel3D中,从而加快了后续操作。没有必要调用prepare_object_model_3d。但是,如果要多次使用3D对象…

5、js关于数组的常用方法(19种)

一、改变原数组的方法 1.push() 末尾添加数据 语法: arr.push(要插入的数据可以多个) // push 尾部添加数据const arr [1,2,3,4,5];arr.push(6,7);console.log(arr);//(7) [1, 2, 3, 4, 5, 6, 7]2. pop() 末尾删除一…

大疆智图_空三二维重建成果传输

一、软件环境 1.1 所需软件 1、 大疆智图:点击下载;   2、 ArcGIS Pro 3.1.5:点击下载,建议使用IDM或Aria2等多线程下载器;   3、 IDM下载器:点击下载,或自行搜索;   4、 Fas…

探索 Noisee AI 的奇妙世界与变现之旅

日赚800,利用淘宝/闲鱼进行AI音乐售卖实操 如何让AI生成自己喜欢的歌曲-AI音乐创作的正确方式 抖音主播/电商人员有福了,利用Suno创作产品宣传,让产品动起来-小米Su7 用sunoAI写粤语歌的方法,博主已经亲自实践可行 五音不全也…

[经验] 涠洲岛在广西吗 #职场发展#知识分享#媒体

涠洲岛在广西吗 广西涠洲岛,是中国南海上的一颗闪亮明珠,位于广西北部湾沿海,东经108.71度,北纬21.54度,距离北海市区30公里,是中国最大的海岛之一,风景秀丽,气候温和。岛上山青水秀…

!力扣3. 无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是"abc",所以其长度为 3 示例 2: 输入: s "bbbbb" 输出: 1 …

PCE自动装机

服务端和客户端 pxe:c/s模式,允许客户端通过远程服务器(服务端)下载引导镜像,加载安装吻技安,实现自动化安装操作系统。 无人值守:安装选项不需要认为干预,可以自动化实现。 pxe优点: 1.规模…

Overall timing accuracy 和Edge placement accuracy 理解

在电子设计自动化(EDA)、集成电路(IC)制造和高速数字电路设计领域,"Overall Timing Accuracy" 和 "Edge Placement Accuracy" 是两个关键的性能指标,它们对于确保电路的功能正确性和性能至关重要。 当涉及到“Overall timing accuracy”(总体时序精度)…

最小相位系统

最小相位系统 1、传递函数 一个线性系统的响应。 比如一个RC低通滤波器: 交流分量在电容的充放电中被滤除掉,通过设置电容器的电容值,以及电阻值,能够控制这种滤除能力,这个参数为RC。 电容的电抗为 1 / j w C 1/j…

单片机+TN901非接触式红外测温设计

摘要 温度测量技术应用十分广泛,而且在现代设备故障检测领域中也是一项非常重要的技术。但在某些应用领域中,要求测量温度用的传感器不能与被测物体相接触,这就需要一种非接触的测温方式来满足上述测温需求。本论文正是应上述实际需求而设计的…

C语言实战:贪吃蛇(万字详解)

💡目录 效果图 界面设计思路 1. 基本布局 2. 视觉元素 游戏机制设计 基本规则 游戏代码 前期准备 游戏代码详解 数据结构设计 宏定义 数据结构定义 函数原型(详见后文) 主函数代码 核心代码 Review 效果图 界面设计思路 1. 基…

转型AI产品经理(4):“认知负荷”如何应用在Chatbot产品

认知负荷理论主要探讨在学习过程中,人脑处理信息的有限容量以及如何优化信息的呈现方式以促进学习。认知负荷定律认为,学习者的工作记忆容量是有限的,而不同类型的认知任务会对工作记忆产生不同程度的负荷,从而影响学习效果。以下…

Python自学(适用于略有基础)

Python语法(基于C语言基础和简单Python基础) 参考学习资料:【你觉得自己这辈子都学不会编程?超超超基础Python课程,3小时快速入门 【自学Python教程合集】【3小时快速入门Python】】 https://www.bilibili.com/video/B…

Elasticsearch 认证模拟题 - 16

一、题目 创建一个搜索模版,要求 match_prase 查询,并且用指定的格式高亮,并排序 # 创建索引 PUT my_index {"settings": {"number_of_replicas": 0,"number_of_shards": 1},"mappings": {"p…

【SpringCloud学习笔记】Docker(上篇)

Docker 1. 前置准备 在学习Docker之前我们需要具备以下环境: Linux云服务器 / 虚拟机安装并配置Docker环境(命令行中输入docker -v能够显示对应版本证明安装成功) 2. 快速入门 要求: 我们先来尝试使用Docker创建MySQL服务&am…

如何离线下载 Microsoft Corporation II Windows Subsystem for Android

在本文中,我们将指导您通过一个便捷的步骤来离线下载 Microsoft Corporation II Windows Subsystem for Android。这个过程将利用第三方工具来生成直接下载链接,从而让您能够获取该应用程序的安装包,即使在没有访问Microsoft Store的情况下也…

ChatGLM2-6b的本地部署

** 大模型玩了一段时间了,一直没有记录,借假期记录下来 ** ChatGlm2介绍: chatglm2是清华大学发布的中英文双语对话模型,具备强大的问答和对话功能,拥有长达32K的上下文,可以输出比较长的文本。6b的训练参…

HTTP常见响应状态码

1xx:正在处理中 100 Continue:服务器确认收到了请求的第一部分,并告知客户端继续发送剩余的请求。 101 Switching Protocols:服务器根据客户端的请求,同意切换到另一个协议。 2xx:成功响应 200 OK&#…

pycharm使用pip安装依赖包报错 -----Microsoft Visual C++ 14.0 is required解决方法

pip安装第三方库的时候会报错:需要Microsoft Visual C14.0或更高版本。 报错原因 因为pip所安装的包需要使用C编译后才能够正常安装,但是当前安装环境中缺少完整的C编译环境,因此安装失败。 这样解决方案就很明确了,安装完整的C编…

【学习笔记】解决 VMware Workstation 17 Player 和主机之间无法复制粘贴的问题

【学习笔记】解决 VMware Workstation 17 Player 和主机之间无法复制粘贴的问题 使用VMware Workstation 17 Player,再上面安装 Ubuntu ,安装完之后,需要和主机之间进行复制粘贴。 首先安装了VMware Tools。 在打开的页面下把 VMwareTools…