-
Notifications
You must be signed in to change notification settings - Fork 0
/
lognormal_likelihood.m
89 lines (61 loc) · 2.6 KB
/
lognormal_likelihood.m
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
function [ likelihood ] = lognormal_likelihood( lognormal_data, lognormal_input, lognormal_test, class_assoc, classes )
num_features_lognormal = size(lognormal_data,2)-1; % minus 1 since true_stars column not considered
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Calculating mu for the training set
mu = zeros(classes,num_features_lognormal);
class_count = zeros(classes,1);
N = size(lognormal_data,1);
logx_val = zeros(1,num_features_lognormal);
for i=1:N
class_count(class_assoc(i)) = class_count(class_assoc(i)) + 1;
logx_val = log(lognormal_input(i,:));
logx_val(isinf(logx_val)) = 0;
mu(class_assoc(i),:) = mu(class_assoc(i),:) + logx_val;
%temp_feature_wo_zero(temp_feature_wo_zero == 0) = [];
%mu(1,j) = sum(log(temp_feature_wo_zero)); % j+1 as 1st row is true_stars
end
for c=1:classes
if class_count(c)~=0
mu(c,:) = mu(c,:)/class_count(c);
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Calculating variance for the training set
%Initialize covar: d x d x k matrix - Identity Matrix
covar = eye(num_features_lognormal);
sum_covar = eye(num_features_lognormal);
logx_val = zeros(1,num_features_lognormal);
for c=1:classes
covar(:,:,c) = eye(num_features_lognormal);
sum_covar(:,:,c) = eye(num_features_lognormal);
end
for i=1:N
logx_val = log(lognormal_input(i,:));
logx_val(isinf(logx_val)) = 0;
sum_covar(:,:,class_assoc(i)) = sum_covar(:,:,class_assoc(i)) + ...
((logx_val-mu(class_assoc(i),:))'*(logx_val-mu(class_assoc(i),:)));
end
for c=1:classes
if(det(sum_covar(:,:,c))<0.0001)
sum_covar(:,:,c) = sum_covar(:,:,c) + 0.001 .* eye(num_features_lognormal);
end
if class_count(c)~=0
covar(:,:,c) = sum_covar(:,:,c)/class_count(c);
end
end
%Calcualte likelihood from the distribution function for lognormal
length(lognormal_test);
likelihood = zeros(length(lognormal_test),classes);
for entry=1:length(lognormal_test)
for c=1:classes
log_ip_lower = log(lognormal_test(entry,:));
log_ip_lower(isinf(log_ip_lower))=0;
log_ip_higher = log(lognormal_test(entry,:)+1);
log_ip_higher(isinf(log_ip_higher))=0;
% likelihood_calc(c,1) = exp((-0.5) * ( (log_ip-mu(c,:)) * (log_ip-mu(c,:))' ) ./ sigma(:,:,c));
% likelihood(c,1) = (0.3989*likelihood_calc(c,1)) ./ (lognormal_test.*sqrt(sigma(:,:,c))); % 1/root(2*pi) = 0.3989
likelihood(entry,c) = mvncdf(log_ip_higher,mu(c,:),covar(:,:,c)) - mvncdf(log_ip_lower,mu(c,:),covar(:,:,c));
end
end
likelihood;
end