2009-07-21 5 views
1

Considérons un vecteur V criblé d'éléments bruyants. Quel serait le moyen le plus rapide (ou quelconque) de trouver un élément maximum raisonnable?Recherche d'un élément maximum raisonnable (sans bruit) dans un vecteur

Par exemple,

V = [1 2 3 4 100 1000] 
rmax = 4; 

Je pensais à trier les éléments et de trouver le deuxième différentiel {à savoir diff (diff (unique (V)))}.

EDIT: Désolé pour le délai.

Je ne peux pas publier de données représentatives car il contient des éléments 6.15e5. Mais voici une intrigue des éléments triés.

sorted http://i26.tinypic.com/10ykztv.jpg

En regardant juste à la parcelle, une fonction linéaire par morceaux peut fonctionner.

Quoi qu'il en soit, en ce qui concerne ma conjecture précédente sur l'utilisation des différentiels, voici un tracé de diff (tri (V));

diff vs x http://i31.tinypic.com/wmflfb.jpg

je l'espère, il est plus clair maintenant.

EDIT: Pour être clair, la valeur "maximum" désirée serait la valeur juste avant le pas dans le tracé des éléments triés.

+3

Pouvez-vous préciser ce que vous entendez par raisonnable? L'élément maximum pour moi semble être 1000. Qu'est-ce qui diff à faire avec ça? Peut-être que je ne sais pas ce que vous essayez de faire ... – bayer

+2

Vous devez absolument définir ce que vous voulez dire, et quelle est la structure de bruit attendue. Il semble que les éléments 100 et 1000 de ce vecteur soient destinés à être ignorés, en tant que valeurs aberrantes apparentes. –

+1

Existe-t-il un modèle pour les données pertinentes? Par exemple le signal pourrait une onde sinusoïdale et il pourrait y avoir +/- 10 comptes de bruit dessus ... – Gabe

Répondre

4

NOUVELLE RÉPONSE:

Sur la base de votre tracé des amplitudes triées, votre algorithme diff(sort(V)) serait probablement bien fonctionner. Vous devez simplement choisir un seuil pour ce qui constitue une différence "trop ​​grande" entre les valeurs triées. Le premier point de votre vecteur diff(sort(V)) qui dépasse ce seuil est ensuite utilisé pour obtenir le seuil à utiliser pour V. Par exemple:

diffThreshold = 2e5; 
sortedVector = sort(V); 
index = find(diff(sortedVector) > diffThreshold,1,'first'); 
signalThreshold = sortedVector(index); 

Une autre alternative, si vous êtes intéressé à jouer avec elle, est de regrouper vos données à l'aide HISTC. Vous vous retrouvez avec des groupes de poubelles très peuplées à des amplitudes faibles et élevées, avec des poubelles peu peuplées entre les deux. Il s'agira alors de décider quels intervalles vous comptez dans le groupe de faible amplitude (tel que le premier groupe de groupes contenant au moins X comptes). Par exemple:

binEdges = min(V):1e7:max(V); % Create vector of bin edges 
n = histc(V,binEdges);   % Bin amplitude data 
binThreshold = 100;   % Pick threshold for number of elements in bin 
index = find(n < binThreshold,1,'first'); % Find first bin whose count is low 
signalThreshold = binEdges(index); 

RÉPONSE VIEUX (pour la postérité):

Trouver un "élément maximal raisonnable" dépend entièrement de votre définition de raisonnable. Il existe de nombreuses façons de définir un point comme aberrant, comme choisir simplement un ensemble de seuils et ignorer tout ce qui est hors de ce que vous définissez comme «raisonnable». En supposant que vos données ont une distribution normale-ish, vous pouvez probablement utiliser une approche simple seuillage axée sur les données pour éliminer les valeurs aberrantes d'un vecteur V en utilisant les fonctions MEAN et STD:

nDevs = 2; % The number of standard deviations to use as a threshold 
index = abs(V-mean(V)) <= nDevs*std(V); % Index of "reasonable" values 
maxValue = max(V(index));    % Maximum of "reasonable" values 
+0

ceci est vrai si vous n'avez pas trop d'éléments corrompus. Sinon, votre moyenne sera corrompue, et même les éléments sans bruit sortiront de la borne 'nDevs * std (V)' – ThibThib

+0

@ThibThib: Vous avez raison. Je donnais juste un exemple pour traiter des données qui ont une distribution presque normale. Il est difficile de donner autre chose que des exemples généraux puisque l'auteur ne donne pas beaucoup de détails sur les types de signaux avec lesquels il travaille. – gnovice

+2

Mes excuses pour le vague OP. J'espère que la version mise à jour est plus informative. – Jacob

1

Avez-vous accès aux limites de vos éléments sans bruit? Par exemple, savez-vous que vos éléments sans bruit se situent entre -10 et 10?

Dans ce cas, vous pouvez supprimer le bruit, puis trouver le max

max(v(find(v<=10 & v>=-10))) 
+0

En fait, vous n'avez même pas besoin de l'appel de FIND ... vous pouvez indexer 'v' avec un vecteur logique:' max (v (abs (v) <= 10)) ' – gnovice

+0

Non, je ne sais pas où les éléments sans bruit sont. – Jacob

3

je ne serais pas sorte, alors la différence. Si vous avez des raisons d'espérer une continuité ou un changement borné (le vecteur est constitué de lectures consécutives du capteur), alors le tri détruira l'information temporelle (ou ce que l'index vectoriel représente). Filtrer en détectant de grosses pointes n'est pas une mauvaise idée, mais vous voudriez comparer le pic à un plus grand voisinage (la 2ème différence a effectivement pour effet de regarder dans une fenêtre de + -2).

Vous devez décrire formellement les informations attendues dans le vecteur et le type de bruit.

Vous devez connaître la fréquence et la distribution des erreurs et des non-erreurs. Dans le modèle le plus simple, les éléments de votre vecteur sont indépendants et distribués de façon identique, et les erreurs sont toutes ou aucune (vous choisissez aléatoirement de stocker la vraie valeur, ou une erreur). Vous devriez être capable de comprendre pour chaque élément la chance qu'il est précis, par rapport à la chance que c'est le bruit. Cela pourrait être très facile (les valeurs des données d'erreur sont toujours dans une certaine plage qui ne chevauche pas les valeurs sans erreur), ou très difficile. Pour simplifier: ne faites aucune hypothèse sur le type de données qu'une erreur produit (le pire des cas est: vous ne pouvez pas exclure l'un des points d'erreur comme étant ridicule, mais ils sont tous au niveau ou au-dessus le maximum parmi les mesures sans erreur). Ensuite, si la probabilité d'erreur est p, et que votre vecteur a n éléments, alors la probabilité que le kième élément le plus élevé du vecteur soit inférieur ou égal au maximum réel est donnée par la distribution binomiale cumulative - http://en.wikipedia.org/wiki/Binomial_distribution

+0

Je n'avais pas l'intention de trier la différence: j'ai proposé de trouver la différence des valeurs triées pour trouver des pics. – Jacob

+0

J'ai dit sort * ALORS * différence, pas trier * LA * différence :) Mes raisons de ne pas le faire sont toujours valables. Prendre des différences adjacentes entre des choses qui n'étaient pas adjacentes à l'origine est discutable. –

+1

Votre exemple de graphe indique clairement que vous pouvez simplement utiliser les statistiques de classement (qui nécessitent un tri ou un binning). Puisque vos mauvaises valeurs se produisent beaucoup moins de la moitié du temps, vous devriez jeter tout ce qui est au-delà d'une certaine différence par rapport à la médiane, c'est-à-dire supprimer le i pour lequel abs (v [i] -v_median)> t. –

2

Si vous pensez que les nombres proviendront d'une distribution normale, vous pouvez utiliser une valeur 2xsd (écart-type) au-dessus de la moyenne pour déterminer votre valeur max.

+0

C'est intéressant mais pas tout à fait correct.Une combinaison linéaire de la moyenne et de la sd fonctionne, mais comment puis-je le déterminer? – Jacob

Questions connexes