Added source Matlab code for reference
This commit is contained in:
parent
b8af977117
commit
b5d99903d2
186 changed files with 61405 additions and 1 deletions
70
matlab/admixture/learn_simple_partition.m
Normal file
70
matlab/admixture/learn_simple_partition.m
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
function part = learn_simple_partition(ordered_points, fii)
|
||||
% Goes through all the ways to divide the points into two or three groups.
|
||||
% Chooses the partition which obtains highest logml.
|
||||
|
||||
npoints = length(ordered_points);
|
||||
|
||||
% One cluster:
|
||||
val = calculatePopLogml(ordered_points,fii);
|
||||
bestValue = val;
|
||||
best_type = 'single';
|
||||
|
||||
% Two clusters:
|
||||
for i=1:npoints-1
|
||||
% The right endpoint of the first cluster.
|
||||
val_1 = calculatePopLogml(ordered_points(1:i),fii);
|
||||
val_2 = calculatePopLogml(ordered_points(i+1:end),fii);
|
||||
total = val_1 + val_2;
|
||||
if total>bestValue
|
||||
bestValue = total;
|
||||
best_type = 'double';
|
||||
best_i = i;
|
||||
end
|
||||
end
|
||||
|
||||
% Three clusters:
|
||||
for i=1:npoints-2
|
||||
for j=i+1:npoints-1
|
||||
val_1 = calculatePopLogml(ordered_points(1:i),fii);
|
||||
val_2 = calculatePopLogml(ordered_points(i+1:j),fii);
|
||||
val_3 = calculatePopLogml(ordered_points(j+1:end),fii);
|
||||
total = val_1 + val_2 + val_3;
|
||||
if total>bestValue
|
||||
bestValue = total;
|
||||
best_type = 'triple';
|
||||
best_i = i;
|
||||
best_j = j;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
part = zeros(npoints,1);
|
||||
|
||||
switch best_type
|
||||
case 'single'
|
||||
part = ones(npoints,1);
|
||||
case 'double'
|
||||
part(1:best_i) = 1;
|
||||
part(best_i+1:end) = 2;
|
||||
case 'triple'
|
||||
part(1:best_i) = 1;
|
||||
part(best_i+1:best_j) = 2;
|
||||
part(best_j+1:end) = 3;
|
||||
end
|
||||
|
||||
|
||||
%------------------------------------------
|
||||
|
||||
|
||||
function val = calculatePopLogml(points,fii)
|
||||
% Calculates fuzzy (log) marginal likelihood for a population of real
|
||||
% values using estimate "fii" for the dispersion value, and Jeffreys prior
|
||||
% for the mean parameter.
|
||||
|
||||
n = length(points);
|
||||
fuzzy_ones = sum(points);
|
||||
fuzzy_zeros = n-fuzzy_ones;
|
||||
|
||||
val = gammaln(1) - gammaln(1 + n/fii) ...
|
||||
+ gammaln(0.5 + fuzzy_ones/fii) + gammaln(0.5 + fuzzy_zeros/fii) ...
|
||||
- gammaln(0.5) - gammaln(0.5);
|
||||
Loading…
Add table
Add a link
Reference in a new issue