0

我对 Mathematica 很陌生,我对创建函数时产生的错误感到非常沮丧。下面,我正在编写一个函数,用于“居中”矩阵,其中行对应于示例,列对应于特征。目的是从每个元素中减去它所属列的平均值。

centerdata[datamat_] := (

  numdatapoints = 
   Dimensions[datamat][[1]](*Get number of datapoints*)

     numberfeatures = 
    Dimensions[datamat[[1]]][[1]](*Get number of datapoints*)

      columnmean = ((Total[datamat])/numdatapoints)

      For[i = 1, i < numdatapoints + 1, i++, (* For each row*)

       For[j = 1, j < numfeatures + 1, j++, (* For each element*)

              datum = datamat[[i]][[j]];
         newval = (datum - (colmean[[j]]));
         ReplacePart[datamat, {i, j} -> newval];
         ];
       ];

  Return[datamat];
  )

为矩阵运行此函数,我收到以下错误:

"Set::write: 4 {5.84333,3.054,3.75867,1.19867} 中的标记时间受保护。>> Set::write: "4\ 150 中的标记时间受保护。"

其中 {5.84333,3.054,3.75867,1.19867} 是数据矩阵中的第一个示例,而 150 是矩阵中示例的数量(我使用的是著名的iris dataset,对于任何感兴趣的人)。这些错误对应于以下代码:

numdatapoints = Dimensions[datamat][[1]](*Get number of datapoints*)

numberfeatures = Dimensions[datamat[[1]]][[1]](*Get number of datapoints*)

谷歌搜索和玩弄这个错误并没有多大帮助,因为一般回复与乘法有关,这显然没有在这里完成。

4

1 回答 1

2

给定一个数据表 ( tab),该函数Mean[tab]将返回每列均值的列表。接下来,您想从表中的每一行中减去这个(按元素),试试这个:

Map[Plus[-Mean[tab],#]&,tab]

我有一种感觉,可能有一个内在的统计函数可以在一个语句中执行此操作,或者我对更简单的解决方案视而不见。

由于您是初学者,我建议您立即阅读以下文档:

  • Map,这是 Mathematica 等函数式编程语言中的基本运算符之一;和
  • 纯函数,其使用涉及神秘符号#&.

如果您在 Mathematica 程序中编写循环,则几乎可以肯定您误用了系统。

于 2012-12-12T19:47:18.360 回答