ToB企服应用市场:ToB评测及商务社交产业平台

标题: KMeans聚类分析星 [打印本页]

作者: 盛世宏图    时间: 2024-6-14 21:42
标题: KMeans聚类分析星
目录
1. datasample
2.size()
1.一维向量
2.二维矩阵
3.三维数组
3.zeros()
4.findClosestCentroids()
5.computeCentroids(X, idx, K)
1.mean(X(idx == i, )生成布尔矩阵
2.mean()函数


1. datasample

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

  1. function [centroids, idx] = runKMeans(X, initial_centroids, max_iters)
  2.     % 获取样本数和特征数
  3.     [m, n] = size(X);
  4.     % 获取聚类中心数
  5.     k = size(initial_centroids, 1);
  6.     % 初始化变量
  7.     centroids = initial_centroids;
  8.     previous_centroids = centroids;
  9.     idx = zeros(m, 1);
  10.     % 运行 K-means
  11.     for i = 1:max_iters
  12.         % 聚类分配步骤
  13.         idx = findClosestCentroids(X, centroids);
  14.         % 更新聚类中心
  15.         centroids = computeCentroids(X, idx, k);
  16.         % 如果聚类中心变化很小,则停止迭代
  17.         if isequal(previous_centroids, centroids)
  18.             break;
  19.         end
  20.         previous_centroids = centroids;
  21.     end
  22. end
复制代码
以上界说了一个名为runKMeans的函数,它接受三个输入参数:样本数据矩阵X、初始聚类中信initial_centroids和最大迭代次数max_iters。该函数输出两个变量:最终的聚类中心centroids和每个样本所属的聚类索引idx。
2.size()

   [m, n] = size(X);
  k = size(initial_centroids, 1);
  
size()函数用于获取数组(包括但不限于矩阵、向量、多维数组等)的尺寸信息,它可以给返回数组的行数、列数、或是更高维度的大小。size函数的根本语法
   size(A)
  size(A, dim)
  
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);
  
在MATLAB中,zeros是一个用于创建全零数组(矩阵) 的函数,根本语法:
   Z = zeros(size)
  Z = zeros(sz1, ..., szN)
  Z = zeros(sz, dim)
   4.findClosestCentroids()

   idx = findClosestCentroids(X, centroids);
  聚类分配:调用findClosestCentroids函数,该函数计算每个样本点距离全部聚类中心的距离,并为每个样本分配最近的聚类中心的索引,将结果存入idx。
  1. function idx = findClosestCentroids(X, centroids)
  2.     K = size(centroids, 1);
  3.     idx = zeros(size(X,1), 1);
  4.     % 计算每个样本点到各个聚类中心的距离
  5.     for i = 1:size(X,1)
  6.         distances = zeros(K, 1);
  7.         for j = 1:K
  8.             distances(j) = sum((X(i,:) - centroids(j,:)).^2);
  9.         end
  10.         % 找到最近的聚类中心
  11.         [~, idx(i)] = min(distances);
  12.     end
  13. end
复制代码

   distances(j) = sum((X(i, - centroids(j,).^2);
  这行代码用来计算一个数据点到某个聚类中心得欧几里得距离得平方和

综上所述,这行代码的完整意义是:对于数据点X中的第i个点,计算它与聚类中心centroids中第j个中心的每个特征值的差值,然后将这些差值各自平方,末了将这些平方差值相加起来可以得到距离的平方和,存储在distances(j)中。如许,通过遍历全部聚类中心,可以找到距离第i个数据点最近的聚类中心,并记录下该中心的索引。
   [~, idx(i)] = min(distances);
  这行代码用来找到数组中的最小值并同时获取其索引。

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

  1. function centroids = computeCentroids(X, idx, K)
  2.     [m, n] = size(X);
  3.     centroids = zeros(K,n);
  4.     % 对每个聚类计算新的聚类中心
  5.     for i = 1:K
  6.         centroids(i,:) = mean(X(idx == i,:));
  7.     end
  8. end  
复制代码
这个函数用于计算K-means聚类算法中的新聚类中心。
   function centroids = computeCentroids(X, idx, K)
  
   [m, n] = size(X);
centroids = zeros(K,n);
  
   for i = 1:K
        centroids(i, = mean(X(idx == i, );
    end
  
综上所述,函数的主要作用是根据当前数据点到聚类的分配情况(由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, :))工作流程:
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],即每行的平均值

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4