blob: 7dca82798154269151c2d8c3981d804348a776f7 [file] [log] [blame]
#-------------------------------------------------------------
#
# 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.
#
#-------------------------------------------------------------
pnmf2 = function(matrix[double] V, integer max_iteration, integer rank) return (matrix[double] W, matrix[double] H) {
n = nrow(V)
m = ncol(V)
range = 0.1
W = Rand(rows=n, cols=rank, min=0, max=range, pdf="uniform")
H = Rand(rows=rank, cols=m, min=0, max=range, pdf="uniform")
i=0
while(i < max_iteration) {
H = (H * (t(W) %*% (V/(W%*%H))))/t(colSums(W))
W = (W * ((V/(W%*%H)) %*% t(H)))/t(rowSums(H))
i = i + 1;
print("at iteration: "+i)
}
}
negloglikfunc = function(matrix[double] V, matrix[double] W, matrix[double] H) return (double negloglik) {
negloglik = -1 * (sum(V*log(W%*%H)) - as.scalar(colSums(W)%*%rowSums(H)))
}
# data & args
X = rand(rows=2000,cols=2000, sparsity=0.001)
max_iteration = 5
rank = as.integer($1)
# run PNMF and evaluate
[W, H] = pnmf2(X, max_iteration, rank)
negloglik_temp = negloglikfunc(X, W, H)
# write outputs
negloglik = matrix(negloglik_temp, rows=1, cols=1)
print(sum(negloglik)+" "+sum(W)+" "+sum(H));