Je veux représenter une variable sous la forme d'un nombre compris entre 0 et 1. La variable est un entier non négatif sans limite inhérente. Je mappe 0 à 0, mais que puis-je mapper à 1 ou à des nombres entre 0 et 1?
Je pourrais utiliser l'historique de cette variable pour fournir les limites. Cela signifierait que je dois retraiter les anciennes statistiques si le maximum augmente. Dois-je le faire ou y a-t-il d'autres astuces à connaître?
normalization
Russell Gallop
la source
la source
Réponses:
Une astuce très courante pour le faire (par exemple, dans la modélisation connexionniste) consiste à utiliser la tangente hyperbolique tanh comme «fonction d'écrasement». Elle ajuste automatiquement tous les nombres dans l'intervalle entre -1 et 1. Ce qui dans votre cas restreint la plage de 0 à 1. Dans
r
etmatlab
vous l'obtenez viatanh()
.Une autre fonction d'écrasement est la fonction logistique (merci à Simon pour le nom), fournie par , qui restreint la plage de 0 à 1 (avec 0 mappé à. 5). Vous devrez donc multiplier le résultat par 2 et soustraire 1 pour adapter vos données dans l'intervalle entre 0 et 1.f(x)=1/(1+e−x)
Voici un code R simple qui trace les deux fonctions (tanh en rouge, logistique en bleu) afin que vous puissiez voir comment les deux écrasent:
la source
Comme souvent, ma première question allait être « pourquoi voulez-vous faire cela», alors j'ai vu que vous avez déjà répondu à cela dans les commentaires à la question: « Je mesure le contenu à travers de nombreuses dimensions différentes et je veux être capable de faire des comparaisons en termes de pertinence d'un élément de contenu donné. En outre, je souhaite afficher des valeurs explicatives et faciles à comprendre dans ces dimensions. "
Il n'y a aucune raison de normaliser les données afin que le max soit 1 et le min soit zéro pour y parvenir, et mon avis est que ce serait une mauvaise idée en général . Les valeurs max ou min pourraient très facilement être des valeurs aberrantes non représentatives de la répartition de la population. La remarque de séparation @osknows sur l' utilisation des scores est une bien meilleure idéez . scores (ou scores standard) normalisent chaque variable en utilisant son écart type plutôt que sa plage. L'écart type est moins influencé par les valeurs aberrantes. Pour utiliserzz z -les scores, il est préférable que chaque variable ait une distribution à peu près normale, ou au moins une distribution à peu près symétrique (c'est-à-dire qu'elle ne soit pas gravement asymétrique) mais si nécessaire, vous pouvez d'abord appliquer une transformation de données appropriée afin d'y parvenir; quelle transformation utiliser pourrait être déterminée en trouvant la transformation de Box – Cox la mieux adaptée .
la source
mad()
fonction. Et si l'on s'inquiète de l'asymétrie, on peut utiliser les rangs des données au lieu des observations originales. Dans R, ce serait le casrank()
, mais si l'on veut l' utiliser sur de nouvelles données, ceecdf()
serait une meilleure alternative (ecdf(x)
renvoie une nouvelle fonction qui donne fondamentalement la valeur au -quantile de , par exemple, 0 (vraiment ) à la valeur la plus basse de , à la valeur la plus élevée, 0,5 à la médiane, etc.)p x 1 / n x 1Toute fonction sigmoïde fonctionnera:
la source
En plus des bonnes suggestions de Henrik et Simon Byrne, vous pouvez utiliser f (x) = x / (x + 1). À titre de comparaison, la fonction logistique va exagérer les différences à mesure que x augmente. Autrement dit, la différence entre f (x) et f (x + 1) sera plus grande avec la fonction logistique qu'avec f (x) = x / (x + 1). Vous pouvez ou non vouloir cet effet.
la source
Mon article précédent a une méthode pour classer entre 0 et 1. Conseils sur la corrélation d'entrée du classificateur
Cependant, le classement que j'ai utilisé, Tmin / Tmax utilise l'échantillon min / max mais vous pouvez trouver la population min / max plus appropriée. Recherchez également les scores z
la source
Pour ajouter aux autres réponses suggérant pnorm ...
Pour une méthode potentiellement optimale de sélection des paramètres, je suggère cette approximation pour pnorm.
Il s'agit essentiellement de la normalisation Softmax.
Pnorm de référence dans un pincement
la source
Il existe deux façons d'implémenter cela que j'utilise couramment. Je travaille toujours avec des données en temps réel, donc cela suppose une entrée continue. Voici un pseudo-code:
Utilisation d'un minmax entraînable:
Cette fonction nécessite soit que vous effectuiez une phase de formation initiale (en utilisant
calibrate()
) soit que vous vous entraîniez à certains intervalles ou selon certaines conditions. Par exemple, imaginez une fonction comme celle-ci:Utilisation d'un minmax historique:
la source
Une option très simple consiste à diviser chaque nombre de vos données par le plus grand nombre de vos données. Si vous avez beaucoup de petits nombres et quelques très grands, cela pourrait ne pas bien transmettre l'information. Mais c'est relativement facile; si vous pensez que des informations significatives sont perdues lorsque vous représentez graphiquement les données comme ceci, vous pouvez essayer l'une des techniques les plus sophistiquées que d'autres ont suggérées.
la source