首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Haskell中的Pearson相关

Haskell中的Pearson相关
EN

Code Review用户
提问于 2017-02-18 00:39:26
回答 1查看 214关注 0票数 5

作为一项帮助我学习Haskell的练习,我决定写一个小的“程序”来找出两个数字列表的Pearson相关系数。我对结果很不满意,因为我觉得打字很乱,而且很难读懂。

我希望有经验的人能帮助我改进我的代码,并告诉我他们会如何解决这个问题。

代码语言:javascript
运行
复制
import Data.List



summation :: (Integral a, Fractional b) => a -> a -> (a -> b) -> b
summation i n e = if (i < n)
                  then (e i + summation (i+1) n e)
                  else (e i)

mean :: (Real a, Fractional b) => [a] -> b
mean x = (1 / (genericLength x)) *
         (summation 1 (length x) (\i -> realToFrac (x !! (i-1))))

covariance :: (Real a, Fractional b) => [a] -> [a] -> b
covariance x y = (1 / (genericLength x)) *
                 (summation 1 (length x) (\i -> ((realToFrac (x !! (i-1)) - mean x) * (realToFrac (y !! (i-1)) - mean x))))

stddev :: (Real a, Floating b) => [a] -> b
stddev x = ((1 / (genericLength x)) *
             (summation 1 (length x) (\i -> (realToFrac (x !! (i-1)) - mean x) ** 2))) ** (1/2)

pearson :: (Real a, Floating b) => [a] -> [a] -> b
pearson x y = covariance x y / (stddev x * stddev y)
EN

回答 1

Code Review用户

发布于 2017-02-18 04:50:30

代码语言:javascript
运行
复制
import Data.List

mean :: (Floating a) => [a] -> a
mean x = sum / genericLength x
    where sum = foldl (+) 0 x

covariance :: (Floating a) => [a] -> [a] -> a
covariance x y = (mean xy) - (mean x) * (mean y)
    where xy = zipWith (*) x y

pearson :: (Floating a) => [a] -> [a] -> a
pearson x y = (covariance x y) / (stddev x * stddev y)
    where stddev z = (covariance z z)**0.5

学习使用Folds、Maps、Filter和Zips!

它们是函数式编程的关键概念。

列表x上的和可以写为foldl (+) 0 x,产品将是foldl (*) 1 x。这不仅限于基本的数学运算和数字。您可以为任何类型的元素提供任何函数。

以类似的方式,zipWith (*) x y将两个列表连接到产品列表中。

不要重复你自己。

您的函数meancovariancestddev共享大量代码。永远不要复制粘贴代码。创建适当的模块化并重用它。在这里,可以将covariance重新定义为只使用对mean的调用,而stddev只是自协方差(和平方根)。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/155662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档