matlabにn次元の代表的なベクトルのセットがあります。トレーニングベクトルのセットから、近接度に基づいて代表的なベクトルで表されるグループにベクトルをグループ化する必要があります。どうすればいいですか?
user494461
質問する
3247 次
2 に答える
4
を使用dsearchn
して、各ポイントに最も近い代表を見つけることができます。最初に三角測量行列を含まないバージョンを試すことをお勧めします。メモリまたは CPU のパフォーマンスが十分でない場合は、三角測量を調べてください。
于 2012-05-17T16:56:03.560 に答える
1
n次元ベクトルとは、n次元の点の順序付きリストを意味する場合(それが私の理解です)、過去に平均最接近距離を使用してこれを行いました。基本的に、ベクトル 1 の各点について、ベクトル 2 の点までの最小距離を見つけます。2 つのベクトル間の距離は、これらすべての距離の平均になります。ただし、これは対称的ではないため、ベクトル 2 の各ポイントに対して同じプロセスを実行して、ベクトル 1 までの最小距離を見つけ、2 つの平均を最小、最大、または平均などで集計する必要があります。
これは、ループを使用して(3d ベクトル用に)作成したコードです。
function mcd = MCD(fiber1, fiber2, option)
%
%remove NaNs
fiber1(find(isnan(fiber1),1):length(fiber1),:) = [];
fiber2(find(isnan(fiber2),1):length(fiber2),:) = [];
dist = 0;
for k = 1:length(fiber1)
D = [];
for j = 1:length(fiber2)
D = [D distance(fiber1(k,:),fiber2(j,:))];
end;
dist = dist + min(D);
end;
mcd = dist / length(fiber1);
if nargin > 2
dist = 0;
for k = 1:length(fiber2)
D = [];
for j = 1:length(fiber1)
D = [D distance(fiber2(k,:),fiber1(j,:))];
end;
dist = dist + min(D);
end;
mcd2 = dist / length(fiber2);
if strcmp(option,'mean')
mcd = mean([mcd mcd2]);
elseif strcmp(option,'min')
mcd = min([mcd mcd2]);
end;
end;
しかし、これは私には遅すぎました。したがって、これは非常に高速なベクトル化された (ただし、理解するのが難しい) バージョンです。
function mcd = MCD(fiber1, fiber2, option, sampling)
%MCD(fiber1, fiber2)
%MCD(fiber1, fiber2, option)
%MCD(fiber1, fiber2, option, sampling)
%remove NaNs
fiber1(find(isnan(fiber1),1):length(fiber1),:) = [];
fiber2(find(isnan(fiber2),1):length(fiber2),:) = [];
%sample the fibers for speed. Each fiber is represented by "sampling"
%number of points.
if nargin == 4
freq = round(length(fiber1)/sampling);
fiber1 = fiber1(1:freq:length(fiber1),:);
freq = round(length(fiber2)/sampling);
fiber2 = fiber2(1:freq:length(fiber2),:);
end;
%reshape to optimize the use of distance() for speed
FIBER2 = reshape(fiber2',[1,3,length(fiber2)]);
FIBER1 = reshape(fiber1',[1,3,length(fiber1)]); %this is only used in the symmetrical case, i.e when 'min' or 'mean' option is called
%reshape amd tile filber 1 so as to eliminate the need for two nested for
%loops thus greatly increasing the computational efficiency. The goal is to
%have a 4D matrix with 1 row and 3 columns. Dimension 3 is a smearing of
%these columns to be as long as fiber2 so that each vector (1x3) in fiber1
%can be placed "on top" as in a row above the whole of fiber2. Thus dim 3
%is as long as fiber2 and dim 4 is as long as fiber1.
fiber1 = reshape(fiber1',[1,3,length(fiber1)]); %1x3xF1
fiber1 = repmat(fiber1,[length(FIBER2),1,1]); %F2x3xF1
fiber1 = permute(fiber1,[2,1,3]); %3xF2xF1
fiber1 = reshape(fiber1,[1,3,length(FIBER2),length(FIBER1)]);%1,3,F2,F1
mcd = mean(min(distance(fiber1, repmat(FIBER2,[1,1,1,length(FIBER1)]))));
if nargin > 2
fiber2 = reshape(fiber2',[1,3,length(fiber2)]); %1x3xF1
fiber2 = repmat(fiber2,[length(FIBER1),1,1]); %F2x3xF1
fiber2 = permute(fiber2,[2,1,3]); %3xF2xF1
fiber2 = reshape(fiber2,[1,3,length(FIBER1),length(FIBER2)]);%1,3,F2,F1
mcd2 = mean(min(distance(fiber2, repmat(FIBER1,[1,1,1,length(FIBER2)]))));
if strcmp(option,'mean')
mcd = mean([mcd mcd2]);
elseif strcmp(option,'min')
mcd = min([mcd mcd2]);
end;
end;
これは上記で使用した distance() 関数です。私の場合はユークリッド距離を使用しましたが、2 つのベクトルを受け入れることができる限り、最適なものに適応させることができます。
function Edist = distance(vector1,vector2)
%distance(vector1,vector2)
%
%provides the Euclidean distance between two input vectors. Vector1 and
%vector2 must be row vectors of the same length. The number of elements in
%each vector is the dimnesionality thereof.
Edist = sqrt(sum((diff([vector1;vector2])).^2));
于 2012-05-18T07:05:12.013 に答える