【问题标题】:Matrix averages in HaskellHaskell 中的矩阵平均值
【发布时间】:2016-06-10 01:48:02
【问题描述】:

我有一个矩阵,我们以这个为例:

[ [4.0, 2.0, 0.6],
  [4.2, 2.1, 0.59], 
  [3.9, 2.0, 0.58], 
  [4.3, 2.1, 0.62], 
  [4.1, 2.2, 0.63] ] 

现在,我取每列的平均值,结果如下:

 [4.10, 2.08, 0.604]

这些都是我能做的,我有资料。

我现在遇到的问题是这部分。我正在寻找一种方法,用第一个矩阵上的相应元素减去每个平均元素。

应该是这样的:

[ [-0.1, -0.08, -0.004],
  [0.1, 0.02, -0.014],
  [-0.2, -0.08, -0.024],
  [0.2, 0.02, 0.016],
  [0.0, 0.12, 0.026]  ]

我必须使它适用于任意大小的矩阵。

【问题讨论】:

  • 您可能想编写一个辅助函数,它采用“媒体”和输入矩阵的单行并生成输出矩阵的单行。我鼓励您尝试一下,并在问题中包含您对此的想法!
  • 嗯,这里最大的问题是我必须让它与 Amxn 矩阵一起工作,一个“无限”的矩阵。这就是我被卡住的原因。
  • 无限在哪个维度?如果是行,你如何计算平均值?
  • 我认为您会发现使用转置矩阵的行比使用原始矩阵的列更容易。

标签: haskell matrix


【解决方案1】:

类似这样,没有验证和格式化

colmean rs = let (a,c) = agg rs in map (/(fromIntegral c)) a

agg [r] = (r,1)
agg (r:rs) = let (a,c) = agg rs in (zipWith (+) a r, c+1)

minus = flip (zipWith (-))

demean x = map (minus $ colmean x) x

> demean media
[[-9.999999999999964e-2,-8.000000000000007e-2,-4.0000000000000036e-3],
 [0.10000000000000053,2.0000000000000018e-2,-1.4000000000000012e-2],
 [-0.19999999999999973,-8.000000000000007e-2,-2.400000000000002e-2],
 [0.20000000000000018,2.0000000000000018e-2,1.6000000000000014e-2],
 [0.0,0.1200000000000001,2.6000000000000023e-2]]

这样,第二维(列数)可以是无限的

> map (take 10) $ demean [[1..], [2..]]
[[-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5],
 [0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5]]

【讨论】:

  • 好答案!两个建议:minus = zipWith (--)agg可以写成foldr
【解决方案2】:

我会这样做:

mean l = sum l / (fromIntegral (length l))

getColumnMeans = map mean . transpose

normalizeMatrix m = map (zipWith subtract columnMeans) m
    where
        columnMeans = getColumnMeans m

mean 完全符合其名称的含义,getColumnMeans 似乎是您自己实现的功能。

normalizeMatrix 是您正在寻找的功能。它接收一个矩阵,计算其列均值,然后通过map 从其每一行中减去它。

subtract 函数基本上是(-),但它的参数被翻转了。每当我想映射subtract 5 之类的东西时,我都会使用它,它读起来就像普通的英语。因此,subtract 5 10 将返回 5。在这里,zipWith subtract columnMeans 对一行逐个条目执行此操作。 map 对所有行执行此操作。希望这有用。

【讨论】:

  • 这个答案可能会更有用,快速描述正在发生的事情以及它可能是如何工作的。
  • 当然 :) 感谢您的反馈。
猜你喜欢
  • 2018-12-02
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 2014-05-16
  • 2018-08-23
相关资源
最近更新 更多