zoukankan      html  css  js  c++  java
  • 在octave语言中K-means聚类算法求聚类中心的向量化计算

      使用octave编程的时候,一定要注意使用向量化编程的思想,下面我就说说我今天做题遇到的一个K-means聚类问题,如何使用octave中的函数向量计算聚类中心centroids。

    octave几个函数:

      bsxfun:

        二元操作函数,调用方式: bsxfun (F, A, B),A为 向量、二维矩阵或多维矩阵,B也为 向量、二维矩阵或多维矩阵,F为二元操作函数。如果 A 和 B 维度数不一样,或者 对应维度长度不一样,此函数会首先尝试把 A 和 B 都broadcast 到相同维度,且对应维度长度相同的两个向量。然后,再把A和B中一一的两个元素使用二元函数F做计算,返回的结果是与broadcast之后的A和B相同维度、对应维度相同长度的一个向量。

        例如:

          A = [1, 2, 3];  #这里A 可以看做是行向量

          B = [1, 2, 3];  #这里B 可以看做是行向量

          C = bsxfun(@plus, A, B);

          则 C = [2, 4, 6]

        因为它天生支持broadcast,所以如果必须要broadcast,系统不会产生 “warning: operator +: automatic broadcasting operation applied”

        警告。

        例如:

          A2 = A';  # 这里表示 撇号的作用就是求转置。即C是A向量的转置 ,即C是列向量。

          D = bsxfun(@plus, A2, B);

          则 D = [ 2, 3, 4,

                3, 4, 5,

                4, 5, 6] 

          解释:

            发现A2是3×1,B是1×3,于是将A2 broadcast 到3×3,其他两列拷贝第一列的值;B 也broadcast到3×3,

          其他两行拷贝第一行的值;接着,将A2与B对应位置的元素,进行plus操作,这里是求和操作,于是得到结果D。

      accumarray:

        分组计算函数,调用方式: accumarray (SUBS, VALS, SZ, FUNC, FILLVAL, ISSPARSE),SUBS为一个数组,

      其元素内容为新的数组下标值,VALS为一个数组,其元素为要进行操作的数值,缺省的动作是 sum 求和操作。

        例如:

          A = [1, 2, 3, 4]' #注意A为列向量

          B = [1, 2, 1, 2]' #注意B为列向量

          C = accumarray(B, A)

            则 C = [4, 6]' #注意C为列向量。

            解释:

              B的值对应分配到新的数组的对应下标,由于B(1) = B(3) = 2,于是A(1),A(3) 的值分到C(1),且缺省FUNC是求和操作,

            于是C(1)=A(1)+A(3) = 4,同理C(2) = A(2) + A(4) = 6

        accumarray函数调用,返回的结果是一维向量,如果想返回矩阵呢,那就必须用到下面的accumdim函数。

      accumdim:

        分组计算函数,调用方式:accumdim (SUBS, VALS, DIM, N, FUNC, FILLVAL)

        例如:

          A = [1, 1, 1; 2, 2, 2; 3, 3, 3; 4, 4, 4] #A为4×3矩阵

          B = [1, 2, 1, 2]' #B为列向量

          C = accumdim(B, A)

            则 C = [ 4, 4, 4; 6, 6, 6]  #2×3矩阵。

            解释,简单的说,就是将A矩阵中的行向量,按B下标分组,每组中的向量对应列求和,得到新的一个向量。

        假设,X为样本点矩阵,m×n,表示m个样本点,n个特征;idx为一维列向量,其值为m个样本点对应的聚类下标,取值(1..K),即K个聚类。

     centroids即为K个聚类中心,为K×n矩阵,每一行表示一个中心,第k行表示第k个聚类的中心。现在要求新的聚类中心。

    代码如下:

    position = unique(idx)
    
    cmeans = accumdim(idx, X, 1, 0, @mean)
    
    centroids(position, :) = cmeans
    

      

     

  • 相关阅读:
    Power of Cryptography
    Radar Installation
    Emag eht htiw Em Pleh
    Help Me with the Game
    89. Gray Code
    87. Scramble String
    86. Partition List
    85. Maximal Rectangle
    84. Largest Rectangle in Histogram
    82. Remove Duplicates from Sorted List II
  • 原文地址:https://www.cnblogs.com/simplelovecs/p/5137455.html
Copyright © 2011-2022 走看看