/ / Algèbre: comment redimensionner les données avec un ajustement log / exponentiel - maths, algèbre, bin, binning

Algèbre: comment redimensionner les données avec un ajustement log / exponentiel - maths, algèbre, bin, binning

J'ai besoin de réorganiser les données et je ne peux pas pour la vie de savoir comment le faire.

(Int ((1- (([TD] - min)/( max - min)))*20))+1

Cela prendra un nombre compris entre 0 et 1 dans [TD] (en supposant que max = 1 & min = 0) et le divise en 20 codes entiers (je dois être capable de basculer le 20). Le code 1 sera le top 5%, le code 2 = 5-10%, etc.

Mettez 0,954 dans [TD], obtenez un 1, mettez 0,923, obtenez un 2

Actuellement, il se décompose en bacs de taille égale, pouvez-vousrejigger afin que les bacs soient divisés le long de l’échelle logarithmique ou d’une autre courbe exponentielle - voir graphique pour voir le schéma de distribution de base. Important: si vous pouvez résoudre le problème, il doit rester dans la même syntaxe pour que je puisse le déposer dans un programme particulier. La fonction Int () arrondit au nombre entier le plus proche, je ne pouvais "pas trouver une fonction" arrondir "afin que je veuille continuer à l'utiliser. Merci a tous,

entrer la description de l'image ici

Réponses:

0 pour la réponse № 1

Probablement la manière "correcte" de configurer votrebacs à utiliser quelque chose comme l'inverse de la distribution de probabilité de vos données. En général, c’est difficile à construire à moins de connaître les propriétés statistiques de vos données.

Sinon, si vous savez que vos données sontdistribués grossièrement selon une distribution décroissante de façon exponentielle, puis en prenant le logarithme de chaque valeur, vous ferez en sorte que les valeurs transformées soient espacées de manière plus uniforme. Ces valeurs transformées par le journal peuvent ensuite être regroupées à l'aide d'une recette similaire à votre formule.

Le code Python suivant illustre le principe:

import numpy

x = 0.1 + numpy.random.exponential(size=(100000,))

nBins = 20
logX = numpy.log(x)
eps = 1e-9
minLogX, maxLogX = numpy.min(logX), numpy.max(logX)
bins = numpy.floor((nBins - eps) * (logX - minLogX) / (maxLogX - minLogX))
binCentres = numpy.exp(minLogX + (numpy.arange(0, nBins) + 0.5)
* (maxLogX - minLogX) / nBins)

Si nous histogrammes les données d'origine, x, en utilisant 20 bacs, la plupart des données ne sont présentes que dans quelques bacs: entrer la description de l'image ici

Si nous calculons le nombre de données regroupées après l'application de la transformation log / exp, nous obtenons une distribution comme celle-ci (en utilisant à nouveau 20 bacs):

entrer la description de l'image ici

Cela montre un nombre beaucoup plus grand de bacs qui ont des comptes plus élevés dans la région où x=1.5, et montre une séparation croissante entre les bacs comme x augmente.