Repository: systemml
Updated Branches:
  refs/heads/master 08aae51d5 -> 997eb2aa2


[SYSTEMML-1992] Implemenation of Mode finding for Gaussian Process

Closes #711.


Project: http://git-wip-us.apache.org/repos/asf/systemml/repo
Commit: http://git-wip-us.apache.org/repos/asf/systemml/commit/997eb2aa
Tree: http://git-wip-us.apache.org/repos/asf/systemml/tree/997eb2aa
Diff: http://git-wip-us.apache.org/repos/asf/systemml/diff/997eb2aa

Branch: refs/heads/master
Commit: 997eb2aa261b11857983b1eca8bc43dc33719589
Parents: 08aae51
Author: Janardhan <j...@protonmail.com>
Authored: Mon Jan 22 14:44:51 2018 -0800
Committer: Niketan Pansare <npan...@us.ibm.com>
Committed: Mon Jan 22 14:45:48 2018 -0800

----------------------------------------------------------------------
 scripts/staging/gaussian_process/mode.dml | 116 +++++++++++++++++++++++++
 1 file changed, 116 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/systemml/blob/997eb2aa/scripts/staging/gaussian_process/mode.dml
----------------------------------------------------------------------
diff --git a/scripts/staging/gaussian_process/mode.dml 
b/scripts/staging/gaussian_process/mode.dml
new file mode 100644
index 0000000..4f6b83a
--- /dev/null
+++ b/scripts/staging/gaussian_process/mode.dml
@@ -0,0 +1,116 @@
+#-------------------------------------------------------------
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+#-------------------------------------------------------------
+
+# ------------------------------------------
+# Mode finding for binary Laplace GPC
+# ------------------------------------------
+
+# Inputs
+X = matrix(" 0.826062790211596  0.183227263001437    0.515246335524849  
-0.532011376808821 -1.17421233145682 -1.06421341288933
+             1.52697668673337  -1.02976754356662     0.261406324055383   
1.68210359466318  -0.192239517539275   1.60345729812004
+             0.466914435684700  0.949221831131023   -0.941485770955434  
-0.875729346160017 -0.274070229932602   1.23467914689078
+             -0.209713338388737 0.307061919146703   -0.162337672803828  
-0.483815050110121  1.53007251442410   -0.229626450963181
+             0.625190357087626  0.135174942099456   -0.146054634331526  
-0.712004549027423 -0.249024742513714  -1.50615970397972 ", rows=5, cols=6)
+
+y = matrix(" -1 1 1 -1 -1 ", rows=5, cols=1)
+
+# covariance matrix
+K = matrix("     9.9090    4.3453   -2.0279    2.0109 4.3453
+                 4.3453    9.6392    0.8006    4.6520 9.6392
+                -2.0279    0.8006    4.6162    0.7838 0.8006
+                 2.0109    4.6520    0.7838    6.4825 4.6520
+                 4.3453    9.6392    0.8006    4.6520 9.6392 ", rows=5, 
cols=5);
+
+
+mode = function (matrix[double] K, matrix[double] y )
+  return (matrix[double] D, matrix[double] D2) {
+
+  /* INPUT:
+   * K : covariance matrix
+   * y : target vector
+   *
+   * OUTPUT:
+   * f : mode
+   * llh : log likelihood, log p(y|f)
+   */
+
+  I = diag( matrix(1, rows=nrow(K), cols=1) )
+
+  # step 2. initialize f = 0
+  f = matrix(0, rows=nrow(K), cols=1)
+
+
+  # step 3. repeat.. for convergence
+  i = 1;
+  while( i < 10000) {
+
+    # compute the derivative
+    # D = ∇log p(y|f)
+    D = (y+1)/2 - 1 / (1 + exp(-f))
+
+    # step 4. W = - ∇∇log p(y|f)
+    cp = 1/(1+exp(-f)) # class probability
+    D2 = cp * (1-cp)
+    W = diag(cp * (1-cp))
+
+    # compute the square root of W
+    W_sr = W ^ 0.5
+
+    # step 5(b). B = I + W^0.5 K W^0.5
+    B = I + (W_sr) %*% K %*% (W_sr)
+
+    # step 5(a). L = cholesky( I + W^0.5 K W^0.5)
+    L = cholesky(B) # L is a lower triangular matrix
+
+    # step 6. b = W f + ∇log p(y|f)
+    b = W %*% f + D
+
+    # step 7. a = b - W^0.5 t(L) \ (L\(W^0.5 K b))
+    a = b - W_sr %*% solve( t(L), solve(L, W_sr %*% K %*% b) )
+
+    # step 8. f = K a
+    f = K %*% a
+
+    i = i + 1
+  }
+
+  yf = y * f
+
+  llh = -log( 1 + exp(-y * f) )
+
+}
+
+[tmp, yf] = mode(K, y)
+
+
+for( i in 1:nrow(tmp) ) {
+  for( j in 1:ncol(tmp) ) {
+    print("("+ i +","+ j +") "+ as.scalar(tmp[i,j]))
+  }
+  print("")
+}
+
+for( i in 1:nrow(yf) ) {
+  for( j in 1:ncol(yf) ) {
+    print("("+ i +","+ j +") "+ as.scalar(yf[i,j]))
+  }
+  print("")
+}

Reply via email to