diff core/tools/machine_learning/get_fo_deltas.m @ 0:e9a9cd732c1e tip

first hg version after svn
author wolffd
date Tue, 10 Feb 2015 15:05:51 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/tools/machine_learning/get_fo_deltas.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,69 @@
+function [deltas, idx, weights] = get_fo_deltas(r, X, rectify)
+% [deltas, idx, (weights)] = get_fo_deltas(r, X)
+% 
+% returns the difference vectors (dist(a,c) > dist(a,b)) 
+%  for a given ranking: 
+%  deltas{i}(:,1) = a - b, deltas{i}(:,2) = a - c; 
+%
+% set rectify to output absolute values of training examples
+
+if nargin < 3
+    rectify = 0;
+end
+
+% ---
+% NOTE: this preallocation is not complete
+% ---
+deltas = {};
+idx = {};
+weights = [];
+for i = 1:size(r,1)
+    
+    % feature index
+    a = i;
+    
+    % check if ranking is valid
+    if ~isempty(r{i,1}) && ~isempty(r{i,2})&& ...
+        isempty(intersect(r{i,1}, r{i,2}));
+    
+        % ---
+        % NOTE / TODO: the follwing is intended for compability
+        %  both sides of the ranking may have more than one entry.
+        %  for the MTT database, the ranking may be correct, but the 
+        %  inequalities build from non-singular rankings are not
+        %  based on the actual data
+        % ---
+        for j = 1:numel(r{i,1})
+            b = r{i,1}(j);
+            
+            for k = 1:numel(r{i,2})
+                c = r{i,2}(k);
+
+                % ---
+                % get vector deltas, 
+                % NOTE: first: dissimilar, then similar pair
+                % ---
+                [dac] = X(:,a) - X(:,c);
+                [dab] = X(:,a) - X(:,b);
+
+                if ~rectify
+                    deltas{end+1} = [dac dab]; 
+                else
+                    % ---
+                    % rectify the data for training
+                    % ---
+                    deltas{end+1} = abs([dac dab]); 
+                end
+                
+                idx{end+1} = {[a c],[a b]};
+                
+                % save weights
+                if size(r,2) == 3
+                    weights(end+1) = r{i,3}(1);
+                end
+            end
+        end
+    end
+end
+end
+