博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在octave语言中K-means聚类算法求聚类中心的向量化计算
阅读量:5788 次
发布时间:2019-06-18

本文共 1959 字,大约阅读时间需要 6 分钟。

  使用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

  

 

 

转载于:https://www.cnblogs.com/simplelovecs/p/5137455.html

你可能感兴趣的文章
poj 1183
查看>>
从根本解决跨域(nginx部署解决方案)
查看>>
javascript实现的一个信息提示的小功能/
查看>>
Centos7.x:开机启动服务的配置和管理
查看>>
HTML5 浏览器返回按钮/手机返回按钮事件监听
查看>>
xss
查看>>
iOS:百度长语音识别具体的封装:识别、播放、进度刷新
查看>>
JS获取服务器时间并且计算距离当前指定时间差的函数
查看>>
华为硬件工程师笔试题
查看>>
jquery居中窗口-页面加载直接居中
查看>>
cd及目录快速切换
查看>>
Unity Shaders and Effects Cookbook (3-5) 金属软高光
查看>>
31-hadoop-hbase-mapreduce操作hbase
查看>>
C++ 代码风格准则:POD
查看>>
linux-友好显示文件大小
查看>>
【转】【WPF】WPF中MeasureOverride ArrangeOverride 的理解
查看>>
【转】二叉树的非递归遍历
查看>>
NYOJ283对称排序
查看>>
接连遇到大牛
查看>>
[Cocos2d-x For WP8]矩形碰撞检测
查看>>