2009-10-28 9 views
2

J'ai une fonction MATLAB qui trouve des points caractéristiques dans un échantillon. Malheureusement, cela ne fonctionne que dans environ 90% des cas. Mais quand je sais à quels endroits de l'échantillon je suis censé regarder, je peux augmenter cela à presque 100%. Je voudrais donc savoir s'il y a une fonction dans MATLAB qui me permettrait de trouver la plage où se trouvent la plupart de mes résultats, donc je peux alors recalculer mes points caractéristiques. J'ai un vecteur qui stocke tous les résultats et les bons résultats devraient se situer dans une fourchette de 3% entre -24.000 et 24.000. Les résultats erronés sont toujours inférieurs à la plage correcte. Malheureusement, mes antécédents en statistiques sont très rouillés, donc je ne sais pas comment cela s'appellera. Quelqu'un peut-il me donner un indice de ce que je rechercherais? Y a-t-il une fonction intégrée dans MATLAB qui me donnerait la plus petite plage possible où, par ex. 90% des résultats se trouvent.Trouver seulement les points pertinents dans MATLAB

EDIT: Je suis désolé si je n'ai pas clarifié ma question. Tout dans mon vecteur ne peut varier entre -24.000 et 24.000. Environ 90% de mes résultats se situeront dans une fourchette d'environ 1,44 ([24 - (- 24)] * 3% = 1,44). Ceux-ci sont très susceptibles d'être les bons résultats. Les 10% restants sont en dehors de cette fourchette et toujours plus bas (pourquoi je ne suis pas sûr de prendre alors la valeur moyenne est une bonne idée). Ces 10% sont faux et résultent de blips dans mes données d'entrée. Pour trouver les 10% restants je veux répéter mes calculs, mais maintenant je veux seulement vérifier la petite portée. Donc, mon but est d'identifier où se situe ma gamme correcte. Supprimez les valeurs trouvées en dehors de cette plage. Et puis recalculer mes valeurs, pas sur une gamme entre -24.000 et 24.000, mais plutôt sur une petite gamme où j'ai déjà trouvé 90% de mes valeurs.

+0

Je ne suis pas sûr de comprendre ... dites-vous que vous voulez spécifiquement trouver des points dans votre vecteur qui sont entre -24 et 24, en ignorant quoi que ce soit en dehors de cette plage? Ou cherchez-vous une approche générale qui choisit une gamme qui capture 90% des points? – gnovice

Répondre

3

Les points pertinents que vous êtes recherche sont les percentiles:

% generate sample data 
data = [randn(900,1) ; randn(50,1)*3 + 5; ; randn(50,1)*3 - 5]; 
subplot(121), hist(data) 
subplot(122), boxplot(data) 

% find 5th, 95th percentiles (range that contains 90% of the data) 
limits = prctile(data, [5 95]) 

% find data in that range 
reducedData = data(limits(1) < data & data < limits(2)); 

d'autres existent pour détecter Approches outliers, comme le IQR outlier test et le three standard deviation rule, parmi beaucoup d'autres:

%% three standard deviation rule 
z = 3; 
bounds = z * std(data) 
reducedData = data(abs(data-mean(data)) < bounds); 

et

%% IQR outlier test 
Q = prctile(data, [25 75]); 
IQ = Q(2)-Q(1); 
%a = 1.5; % mild outlier 
a = 3.0; % extreme outlier 
bounds = [Q(1)-a*IQ , Q(2)+a*IQ] 
reducedData = data(bounds(1) < data & data < bounds(2)); 

BTW si vous voulez obtenir la valeur z (|X|<z) qui correspond à 90% de la surface sous la courbe, utiliser:

area = 0.9;     % two-tailed probability 
z = norminv(1-(1-area)/2) 
+0

Merci. Cela semble faire l'affaire! – Lucas

1

Peut-être que vous devriez essayer la valeur moyenne (en matlab: mean) et l'écart type (en matlab: std)?

Quelle est la distribution statistique de vos données? Voir aussi wiki page, section "Interprétation et application". En général, pour presque toutes les distributions, les inégalités de Chebyshev sont très utiles.

Dans la plupart des cas, cela devrait fonctionner:

meanval = mean(data) 
stDev = std(data) 

et probablement le plus (75%) de vos valeurs seront placées dans la gamme:

<meanVal - 2*stDev, meanVal + 2*stDev> 
+0

Typo, cela devrait être 95% des valeurs devraient être dans la gamme + ou - 2 * stDev, en supposant que ce soit des données normalement distribuées ... – Harlan

+0

Oui, vous avez raison. Mais je ne suppose pas qu'il est distribué normalement. Les égalités de Chebyshev ont lieu dans le cas général, et il y a 75% pour 2 * stDev – Gacek

+0

Merci pour votre réponse. J'ai ajouté un peu à mon message pour le rendre plus clair. Peut-être que votre approche est suffisante. Malheureusement, je n'aurai plus le temps de travailler dessus aujourd'hui. – Lucas

0

il semble que vous voulez peut-être trouver le numbe r x dans [-24,24] qui maximise le nombre de points d'échantillonnage dans [x, x + 1.44]; probablement le moyen le plus rapide de le faire implique une sorte de points d'échantillonnage, qui est finalement le temps nlog (n); une approximation ringard serait comme suit:

brkpoints = linspace(-24,24-1.44,n_brkpoints); %choose n_brkpoints big, but < # of sample points? 
n_count = histc(data,[brkpoints,inf]); %count # data points between breakpoints; 
accbins = 1.44/(brkpoints(2) - brkpoints(1); %# of bins to accumulate; 
cscount = cumsum(n_count); %half of the boxcar sum computation; 
boxsum = cscount - [zeros(accbins,1);cscount(1:end-accbins)]; %2nd half; 
[dum,maxi] = max(boxsum); %which interval has the maximal # counts? 
lorange = brkpoints(maxi); %the lower range; 
hirange = lorange + 1.44 

cette solution ne Fudge certaines des choses de cas de coin sur le bas et le haut bin, etc.

Notez que si vous allez aller par le Tchebychev l'inégalité de Petunin est probablement applicable, et donnera un léger coup de pouce.

Questions connexes