aboutsummaryrefslogtreecommitdiff
path: root/measures.R
blob: c3f5021f9773e09963728370151f731ecd86e9a6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
stress <- function(Dx, Dy) {
  if (any(Dx != t(Dx)) || any(Dy != t(Dy))) {
    stop("Dx and Dy must be symmetric")
  }

  Dx <- as.matrix(Dx)
  Dy <- as.matrix(Dy)
  if (nrow(Dx) != nrow(Dy)) {
    stop("Dx and Dy must have the same number of elements")
  }

  n <- nrow(Dx)
  s <- vector("numeric", n)
  for (i in 1:n) {
    s[i] <- 0
    for (j in 1:n) {
      if (i == j) {
        next
      }

      s[i] = s[i] + (Dx[i, j] - Dy[i, j])^2 / Dx[i, j]
    }
    s[i] = s[i] / sum(D[i, ])
  }

  s
}

NP <- function(Dx, Dy, k = 9) {
  if (any(Dx != t(Dx)) || any(Dy != t(Dy))) {
    stop("Dx and Dy must be symmetric")
  }

  Dx <- as.matrix(Dx)
  Dy <- as.matrix(Dy)
  if (nrow(Dx) != nrow(Dy)) {
    stop("Dx and Dy must have the same number of elements")
  }

  n <- nrow(Dx)
  if (k >= n) {
    stop("k must be smaller than the number of elements")
  }

  preservation <- vector("numeric", n)
  for (i in 1:n) {
    nx <- order(Dx[i, ])[1 + 1:k]
    ny <- order(Dy[i, ])[1 + 1:k]
    diff <- setdiff(nx, ny)
    preservation[i] <- (k - length(diff)) / k
  }

  preservation
}

d2p <- function(D, sigmas) {
  if (any(D != t(D))) {
    stop("D must be symmetric")
  }

  D <- as.matrix(D)
  n <- nrow(D)
  P <- matrix(data=NA, nrow=nrow(D), ncol=ncol(D))

  for (i in 1:n) {
    denom <- sum(exp(-D[i, ] / sigmas))
    P[i, ] <- exp(-D[i, ] / sigmas) / denom
  }

  P
}

klDivergence <- function(P, Q) {
  if (nrow(P) != ncol(P) || nrow(Q) != ncol(Q)) {
    stop("P and Q must be square")
  }
  if (nrow(P) != nrow(Q)) {
    stop("P and Q must have the same number of elements")
  }

  n <- nrow(P)
  d <- vector("numeric", n)
  for (i in 1:n) {
    d[i] <- sum(P[i, ] * log(P[i, ] / Q[i, ]))
  }

  d
}