所以我使用了这个网站上的样本相关系数公式:系数
公式:[https://i.stack.imgur.com/Jzkm8.png]
我如何将列表中的每个x值和y值分别进行求和?到目前为止,这就是我所拥有的一切:
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值的乘法部分。我需要递归吗?
编辑:我有一个单独的方法来计算标准差。
发布于 2020-03-19 22:05:57
最后一行应该是
xValues.zip(yValues).map { case (x, y) => (x - xMean) * (y - yMean) }.sum这与另一个答案非常接近,添加的细节是,当mapping时,我们需要使用case来分离zip创建的元组。必须这样做,因为map只接受一个参数,而(x, y) => ...是一个具有两个参数的函数。
另一个有效的办法是:
xValues.zip(yValues).map(pair => (pair._1 - xMean) * (pair._2 - yMean)).sum其中,_1和_2访问元组中的项。
请注意,这适用于Scala2.x,Scala 3将支持参数解元。
发布于 2020-03-19 15:26:07
您可以使用zip函数来完成它:
xValues.zip(yValues).map((x, y) => (x - xMean) * (y - yMean)).sum(对不起,如果语法错误,多年来一直没有用scala进行编程)
https://stackoverflow.com/questions/60760187
复制相似问题