KMeans聚类分析星

2024-06-09 00:12
文章标签 聚类分析 kmeans

本文主要是介绍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],即每行的平均值

这篇关于KMeans聚类分析星的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1043705

相关文章

MATLAB层次聚类分析法

转自:http://blog.163.com/lxg_1123@126/blog/static/74841406201022774051963/ 层次聚类是基于距离的聚类方法,MATLAB中通过pdist、linkage、dendrogram、cluster等函数来完成。层次聚类的过程可以分这么几步: (1) 确定对象(实际上就是数据集中的每个数据点)之间的相似性,实际上就是定义一个表征

Spark2.x 入门: KMeans 聚类算法

一 KMeans简介 KMeans 是一个迭代求解的聚类算法,其属于 划分(Partitioning) 型的聚类方法,即首先创建K个划分,然后迭代地将样本从一个划分转移到另一个划分来改善最终聚类的质量。 ML包下的KMeans方法位于org.apache.spark.ml.clustering包下,其过程大致如下: 1.根据给定的k值,选取k个样本点作为初始划分中心;2.计算所有样本点到每

R语言kmeans实例

说明:根据table(iris$Species, kmeans$cluster);可以看出setosa花成功聚为1类(图中绿o),但是versicolor花和virginica有16个分错交叉,但主体部分还是分的较明显的 > df<-iris[,c(1:4)]> set.seed(252964) # 设置随机值,为了得到一致结果 > (kmeans <- kmeans(na.omit(df),

数学建模--K-Means聚类分析

目录 1.聚类分析步骤 1.1简单介绍 1.2两个概念 1.3几种距离 1.4更新质心 1.5终止条件 2.归一化处理 3.肘部法则 4.搭建K-Means分析模型 5.选择最佳K值 6.绘制3D图形 1.聚类分析步骤 1.1简单介绍 K-Means聚类分析是属于聚类分析的一种,这个数据机器学习的算法; 对数据进行自动分组,使得同一组内的数据样本尽可能相似

【机器学习】(5.2)聚类--Kmeans

无监督模型。 聚类算法需要度量样本间的距离,距离度量的方式可以参考【机器学习】(5)聚类--距离度量_mjiansun的博客-CSDN博客 一般会使用欧氏距离。 1. K-means 1.1 基本思想 1.2 算法步骤 注意点与思考: 1. 初始值该怎么选择? 共有如下几种选择方式: (1)根据人的先验知识得到K个初始值,比如男女身高,假定男性身高175cm,女性165cm

程序猿成长之路之数据挖掘篇——Kmeans聚类算法

Kmeans 是一种可以将一个数据集按照距离(相似度)划分成不同类别的算法,它无需借助外部标记,因此也是一种无监督学习算法。 什么是聚类 用官方的话说聚类就是将物理或抽象对象的集合分成由类似的对象组成的多个类的过程。用自己的话说聚类是根据不同样本数据间的相似度进行种类划分的算法。这种划分可以基于我们的业务需求或建模需求来完成,也可以单纯地帮助我们探索数据的自然结构和分布。 什么是K-m

Kmeans算法原理及Python实现

K-means算法是一种广泛使用的聚类算法,其原理相对简单且易于实现,属于无监督学习的一种。以下是对K-means算法原理的详细解析: 一、基本思想 K-means算法的基本思想是将数据集划分为K个簇,使得每个簇内的数据点尽可能相似,而不同簇之间的数据点则尽可能不相似。算法通过迭代的方式,不断调整簇的中心点,直到满足某个终止条件为止。 二、算法步骤 指定聚类数目K:首先,用户需要指

机器学习 | 基于wine数据集的KMeans聚类和PCA降维案例

KMeans聚类:K均值聚类是一种无监督的学习算法,它试图根据数据的相似性对数据进行聚类。无监督学习意味着不需要预测结果,算法只是试图在数据中找到模式。在k均值聚类中,我们指定希望将数据分组到的聚类数。该算法将每个观察随机分配到一个集合,并找到每个集合的质心。然后,该算法通过两个步骤进行迭代:将数据点重新分配到质心最近的聚类。计算每个簇的新质心。重复这两个步骤,直到集群内的变化不能进一步减少。聚类

基于数据挖掘的消费者商品交易数据分析可视化与聚类分析

文章目录 ==有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主==项目介绍项目实现实现流程实现过程数据预处理EDA探索性数据分析聚类分析每文一语 有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主 项目介绍 基于python的消费者商品交易数据分析与可视化主要包含以下内容: 首先探讨如何从各种渠道获取消费者商品交易数据,例如电子商务网站的API、

综合评价 | 基于因子分析和聚类分析的节点重要度综合评价(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 综合评价 | 基于因子分析和聚类分析的节点重要度综合评价(Matlab) 程序设计 完整程序和数据获取方式:私信博主回复基于因子分析和聚类分析的节点重要度综合评价(Matlab)。 参考资料 [1] http://t.csdn.cn/pCWSp [2] https://download.