首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用scala集合方法来建立相关系数的方法?

如何使用scala集合方法来建立相关系数的方法?
EN

Stack Overflow用户
提问于 2020-03-19 15:22:48
回答 2查看 79关注 0票数 1

所以我使用了这个网站上的样本相关系数公式:系数

公式:[https://i.stack.imgur.com/Jzkm8.png]

我如何将列表中的每个x值和y值分别进行求和?到目前为止,这就是我所拥有的一切:

代码语言:javascript
运行
复制
  def correlation[T](elements: List[T], property1: T => Double, property2: T => Double): Double = {
    val xValues = elements.map(property1)
    val yValues = elements.map(property2)
    val Sx = standardDeviation(xValues, property1)
    val Sy = standardDeviation(yValues, property2)
    val xSize = xValues.size.toDouble
    val ySize = yValues.size.toDouble
    val xMean = xValues.sum / xSize
    val yMean = yValues.sum / ySize
    (1/xSize-1) * (xValues.map(x => x - xMean) * yValues.map(y => y - yMean)).sum
 }

例如,我们有一个数据集是List((2,7),(8,12),(11,17))

x̅为7 ((2+8+11)/3= 7)。y̅为12 ((7+12+17)/3=12)。

我试着取每个x值,减去x,̅。(2-7)= -5;(8-7)= 1;(11-7)= 4. y值相同,(7-12)= -5;(12-12)=0;(17-12)=5.

乘以x值和y值,得到(-5*-5)= 25;(1*0)= 0;(4*5)=20。

把每一项加在一起,(25+20)=45。

但是,在求和之前,我似乎无法得到每个x和y值的乘法部分。我需要递归吗?

编辑:我有一个单独的方法来计算标准差。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-19 22:05:57

最后一行应该是

代码语言:javascript
运行
复制
xValues.zip(yValues).map { case (x, y) => (x - xMean) * (y - yMean) }.sum

这与另一个答案非常接近,添加的细节是,当mapping时,我们需要使用case来分离zip创建的元组。必须这样做,因为map只接受一个参数,而(x, y) => ...是一个具有两个参数的函数。

另一个有效的办法是:

代码语言:javascript
运行
复制
xValues.zip(yValues).map(pair => (pair._1 - xMean) * (pair._2 - yMean)).sum

其中,_1_2访问元组中的项。

请注意,这适用于Scala2.x,Scala 3将支持参数解元

票数 1
EN

Stack Overflow用户

发布于 2020-03-19 15:26:07

您可以使用zip函数来完成它:

代码语言:javascript
运行
复制
xValues.zip(yValues).map((x, y) => (x - xMean) * (y - yMean)).sum

(对不起,如果语法错误,多年来一直没有用scala进行编程)

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

https://stackoverflow.com/questions/60760187

复制
相关文章

相似问题

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