他の要素と 0.01 異なる場合、MATLAB で行列の要素を削除する方法を見つけようとしています。私が作成している ROC 曲線のしきい値として、マトリックスのすべての一意の要素を使用することになっていますが、それらが互いに 0.01 以内にある場合に値を削除する方法が必要です (それらがこれが true の場合は基本的に等しい)。
そして、助けていただければ幸いです!
ありがとう!
その許容範囲内の隣接する値をベクトルから単純に削除しようとしている場合は、次のようなものから始めます。
roc = ...
tolerance = 0.1;
idx = [logical(1) diff(roc)>tolerance)];
rocReduced = roc(idx);
'rocReduced'は、元のベクトルの許容範囲内に隣接する値がなかったすべての値を持つベクトルになりました。
このアプローチには、2つの明確な制限があります。
上記では不十分だと思います。とはいえ、ベクトル化された行列演算を使用しながら、これらの(およびその他の)制限を克服する単純な演算は考えられません。
パフォーマンスが大きな問題ではない場合は、次の反復アルゴリズムがアプリケーションに適している可能性があります。
roc = ...
tolerance = 0.1;
mask = true(size(roc)); % Start with all points
last = 1; % Always taking first point
for i=2:length(roc) % for all remaining points,
if(abs(roc(i)-roc(last))<tolerance) % If this point is within the tolerance of the last accepted point, remove it from the mask;
mask(i) = false;
else % Otherwise, keep it and mark the last kept
last = i;
end
end
rocReduced = roc(mask);
これは、必ずしもすべてを捨てることなく、複数の連続するサブトレランス間隔を処理します。また、非単調シーケンスも処理します。
MATLABユーザーは、反復解法(ベクトル化された行列演算と比較して)を敬遠することがありますが、ブルートフォースのパフォーマンスがニーズを満たしている場合は、より洗練された解を見つけるのに苦労する価値がない場合があります。
行列内のすべての要素がグラフG=(V、E)を形成し、2つの頂点(u、v)の差が0.01未満の場合、それらの間にエッジが存在するようにします。ここで、このグラフの隣接行列を作成し、次数が最大の要素を見つけます。それを削除してリストに追加し、グラフから隣接するものを削除して、要素がなくなるまで繰り返します。
コード:
%% Toy dataset
M = [1 1.005 2 ;2.005 2.009 3; 3.01 3.001 3.005];
M = M(:);
A = false(numel(M),numel(M));
for i=1:numel(M)
ind = abs(M-M(i))<=0.01;
A(i,ind) = 1;
end
C = [];
while any(A(:))
[val ind] = max(sum(A));
C(end+1) = M(ind);
A(A(ind,:),:) = 0;
end
これには、行列にn個の要素があるO(n ^ 2)の実行時間があります。ええ、それは遅いです。
あなたの説明から、(すでにコメントで指摘されているように)一連の値をどのように処理したいかはあまり明確ではありません。ゼロにする、列全体を削除する、行全体を削除する
ベクトルの場合、次のようになります (Adams ソリューションに似ています)。
roc = ...
tolerance = 0.1;
% sort it first to get the similar values in a row
[rocSorted, sortIdx] = sort(roc);
% find the differing values and get their indices
idx = [logical(1); diff(rocSorted)>tolerance)];
sortIdxReduced = sortIdx(idx);
% select only the relevant parts from the original vector (revert sorting)
rocReduced = roc(sort(sortIdxReduced));
コードはテストされていませんが、うまくいくはずです。
しきい値または許容誤差を使用してすべての値を十分に近づける前に、matlab inbuilt unique() を使用して実行を減らすことができます。通常、matlab は組み込みを高速化しようとするため、できるだけ多くの組み込みを使用するようにしてください。