Skip to content

Commit 92ad323

Browse files
committed
introduce statistics functions
1 parent 5234a7c commit 92ad323

File tree

5 files changed

+82
-10
lines changed

5 files changed

+82
-10
lines changed

src/main/scala/matrix.scala

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,5 @@ object Matrix:
9898

9999
def appendRowVec(a: Mat, b: Vec): Mat = (a.transpose :+ b).transpose
100100

101-
def euclideanDistance(a: Vec, b: Vec): Double =
102-
math.sqrt(a.zip(b).map((x, y) => (x - y) * (x - y)).sum)
103101

104-
102+

src/main/scala/statistics.scala

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package org.expr.mcdm
2+
3+
object Statistics:
4+
5+
def mean(a: Vec): Double = a.sum / a.length
6+
7+
def variance(a: Vec) : Double =
8+
val m = mean(a)
9+
a.map(x => (x - m) * (x - m)).sum / (a.length - 1.0)
10+
11+
def correlation(a: Vec, b: Vec): Double =
12+
val ma = mean(a)
13+
val mb = mean(b)
14+
var va = variance(a)
15+
var vb = variance(b)
16+
(a.zip(b).map((x, y) => (x - ma) * (y - mb)).sum / math.sqrt(va * vb)) / (a.length - 1.0)
17+
18+
def correlation(a: Mat): Mat =
19+
val n = a.length
20+
val m = a(0).length
21+
val cor = Matrix.zeros(m, m)
22+
for i <- 0 until m do
23+
for j <- 0 until m do
24+
cor(i)(j) = correlation(Matrix.getcolat(a, i), Matrix.getcolat(a, j))
25+
cor
26+
27+
def euclideanDistance(a: Vec, b: Vec): Double =
28+
math.sqrt(a.zip(b).map((x, y) => (x - y) * (x - y)).sum)

src/main/scala/topsis.scala

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package org.expr.mcdm
22

3-
import org.expr.mcdm.MCDMResult;
4-
import org.expr.mcdm.Direction;
5-
import org.expr.mcdm.Matrix;
6-
import org.expr.mcdm.Vec;
7-
import org.expr.mcdm.Mat;
3+
import org.expr.mcdm.MCDMResult
4+
import org.expr.mcdm.Direction
5+
import org.expr.mcdm.Matrix
6+
import org.expr.mcdm.Vec
7+
import org.expr.mcdm.Mat
8+
import org.expr.mcdm.Statistics
89

910
case class TopsisResult(
1011
val normalizedMatrix: Array[Array[Double]],
@@ -39,12 +40,12 @@ def topsis(
3940
}
4041
val distanceToIdeal =
4142
Matrix.applyFunctionToRows(weightedNormalizedMatrix, (row: Vec) =>
42-
Matrix.euclideanDistance(row, ideal))
43+
Statistics.euclideanDistance(row, ideal))
4344

4445

4546
val distanceToAntiIdeal =
4647
Matrix.applyFunctionToRows(weightedNormalizedMatrix, (row: Vec) =>
47-
Matrix.euclideanDistance(row, antiIdeal))
48+
Statistics.euclideanDistance(row, antiIdeal))
4849

4950
val scores = distanceToAntiIdeal.zip(distanceToIdeal).map {
5051
case (danti, di) => danti / (danti + di)

src/test/scala/testmatrix.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,4 +231,5 @@ class TestMatrix extends munit.FunSuite {
231231
val expected = Array(Array(1.0, 2.0, 3.0), Array(4.0, 5.0, 6.0), Array(7.0, 8.0, 9.0))
232232
A.assert(Matrix.elementwise_equal(newmat, expected, 1e-6))
233233
}
234+
234235
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import munit.Assertions as A
2+
3+
import scala.math as math
4+
import org.expr.mcdm.Matrix
5+
import org.expr.mcdm.Statistics
6+
7+
class TestStatistics extends munit.FunSuite {
8+
9+
test("Mean of vector"){
10+
val a = Array(1.0, 2.0, 3.0, 4.0, 5.0)
11+
val mean = Statistics.mean(a)
12+
val expected = 3.0
13+
A.assertEquals(mean, expected)
14+
}
15+
test("Variance of vector"){
16+
val a = Array(1.0, 2.0, 3.0, 4.0, 5.0)
17+
val variance = Statistics.variance(a)
18+
val expected = 2.5
19+
A.assertEquals(variance, expected)
20+
}
21+
test("Correlation of vector with itself"){
22+
val a = Array(1.0, 2.0, 3.0, 4.0, 5.0)
23+
val covariance = Statistics.correlation(a, a)
24+
val expected = 1.0
25+
A.assertEquals(covariance, expected)
26+
}
27+
test("Correlation of two different vectors (-1)"){
28+
val a = Array(1.0, 2.0, 3.0, 4.0, 5.0)
29+
val b = Array(5.0, 4.0, 3.0, 2.0, 1.0)
30+
val covariance = Statistics.correlation(a, b)
31+
val expected = -1.0
32+
A.assertEquals(covariance, expected)
33+
}
34+
test("Correlation matrix of columns of matrix"){
35+
val a = Array(Array(1.0, 2.0, 3.0), Array(4.0, 5.0, 6.0), Array(7.0, 8.0, 90.0))
36+
val corr = Statistics.correlation(a)
37+
val expected = Array(
38+
Array(1.0, 1.0, 0.880812),
39+
Array(1.0, 1.0, 0.880812),
40+
Array(0.880812, 0.880812, 1.0))
41+
A.assert(Matrix.elementwise_equal(corr, expected, 1e-6))
42+
}
43+
44+
}

0 commit comments

Comments
 (0)