forked from someoneAlready/tagging
-
Notifications
You must be signed in to change notification settings - Fork 0
/
predict.m
67 lines (51 loc) · 953 Bytes
/
predict.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
function predict(train, test)
N = 40;
F = 15;
testNum = size(test{1})(1);
trainNum = size(train{1})(1);
for i = 1:testNum
clear dist;
clear X;
for j = 1:trainNum
for k = 1:F
f1 = test{k}(i,:);
f2 = train{k}(j,:);
if k<7
dist(j, k) = l1(f1, f2);
else
if k==7
dist(j, k) = l2(f1, f2);
else
dist(j, k) = x2(f1, f2);
end
end
end
end
for k = 1:F
dist(:,k) = dist(:,k) / max(dist(:,k));
end
dist = sum(dist, 2);
[dist, idx] = sort(dist);
for j = 1:N
for k = 1:F+1
X{k}(:,j) = train{k}(idx(j),:)';
end
end
ans = getTag(test, i, X, F, N);
ans
end
end
function ret = l1(f1, f2)
ret = sum(abs(f1 - f2));
end
function ret = l2(f1, f2)
ret = sum((f1 - f2) .^ 2);
end
function ret = x2(f1, f2)
ret = 0;
f1 = f1 / sum(f1);
f2 = f2 / sum(f2);
sumF1F2 = f1 + f2;
sumF1F2 = sumF1F2 + (sumF1F2 == 0);
ret = sum((f1 - f2) .^ 2 ./ sumF1F2);
end