2016-11-02 14 views
1

Ich habe eine Matrix von m Vektoren (Samples) von n Werten (Features), wobei m ~ 10^6, n = 20 und Alle Funktionen haben einen Wert in [0,1].Abtastung eines Satzes von Merkmalsvektoren, um "einheitliche" Histogramme für jedes Merkmal zu erhalten

Wenn ich Histogramme für jedes der Features berechnen, sind diese ziemlich unterschiedlich. Ich berechne ein einfaches 10-Bins-Histogramm, und ich kann sehen, dass für einige Histogramme nur ein paar Bins (sogar zwei) alle Proben enthalten, einige sind schief Gaussian und einige andere sind ungefähr gleichförmig.

Ich möchte eine Teilmenge dieser Vektoren probieren, um eine "einheitliche" Verteilung für alle Features zu haben. Dies bedeutet im Grunde genommen, dass ich für jedes Bin, das nicht bereits leer ist, ungefähr die gleiche Anzahl von Elementen haben möchte. Ein vernünftiges Minimum an Elementen für diese Untermenge wäre ~ 100.

Meine Sprache der Wahl ist MATLAB, aber ich bin mehr interessiert zu wissen, ob es einen Algorithmus gibt, den ich verwenden könnte, als zu tatsächlichem Code (an dem ich selbst arbeiten kann).

+1

Meine übliche Herangehensweise mit Problemen, die ich kenne, wird schwierig sein und würde eine Optimierung erfordern, ist es, sie auf eine direkte Weise zu kodieren und erst dann zu versuchen, zu optimieren. Sie könnten beginnen, das Problem besser zu verstehen, einen anderen Ansatz zu finden, zu teilen und zu erobern. Vielleicht beginnen Sie mit 'h = Histogramm (...)', h enthält einige gute Informationen. – mpaskov

Antwort

1

Ein Ansatz wäre, eine Annäherung an die Verteilung von Werten entlang jedes Merkmals zu erstellen - oder eine analytische Verteilungsfunktion anzupassen - und dann jede Stichprobe entsprechend zu gewichten.

vfNormValues = randn(1, 10000); % Samples from Normal distribution with mu=1, sigma=0 

fMean = 0; mean(vfNormValues); 
fStd = 1; std(vfNormValues); 
vfWeights = 1./normpdf(vfNormValues, fMean, fStd); % Assume the underlying distribution is Normal 
vfSamples = randsample(vfNormValues, 8000, true, vfWeights); % Weighted random sample with replacement 

figure; 
subplot(1, 2, 1); 
hist(vfNormValues); 
title('Original samples'); 
subplot(1, 2, 2); 
hist(vfSamples); 
title('Weighted re-sampling'); 

Resampling from analytical distribution Wie Sie sehen können, kann der analytische Ansatz zur Überabtastung von Ausreißern führen.

Alternativ können Sie eine voll empirische Verteilungsschätzung verwenden, über ein Histogramm:

nNumBins = floor(sqrt(numel(vfNormValues))); 
[vnCounts, ~, vnBin] = histcounts(vfNormValues, nNumBins); % Set number of bins according to desired accuracy 
vfBinWeights = 1./(vnCounts ./ sum(vnCounts)); 
vfWeights = vfBinWeights(vnBin); 

Und dann eine gewichtete Probe mit Ersatz, wie zuvor auszuführen. Resampling with empirical distribution

Sie müssen dann herausfinden, wie Sie die Verteilungen für die verschiedenen Funktionen kombinieren können. Unter der Annahme statistischer Unabhängigkeit können Sie einfach die Gewichte entlang jedes Merkmals kombinieren, um die Randverteilung zu verwenden. Wenn die Merkmale nicht statistisch unabhängig sind, müssen Sie ein 20-dimensionales Histogramm erstellen.

+0

Können Sie mehr über das 20-dimensionale Histogramm erklären? Meine Eigenschaften sind statistisch abhängig. –

+1

Das 20-d-Histogramm wäre ein 20-dimensionaler Tensor, wobei jede Dimension einem Ihrer Merkmalsräume entspricht. Sie können 'histcounts' verwenden, um automatisches Binning durchzuführen, indem Sie es in einer 'for'-Schleife über die 20 Feature-Dimensionen aufrufen. Das wird Ihnen sagen, in welchem ​​Behälter entlang jeder Dimension eine gegebene Probe fällt. Sie können dann diese 20 Vektoren als Indizes in Ihren 20-dimensionalen Raum verwenden, um Ihr großes Histogramm zu erstellen und Ihre abhängige Verteilung und Gewichte für jede Probe zu schätzen. –

Verwandte Themen