Vraag:
Hoe een onbegrensde variabele weer te geven als een getal tussen 0 en 1
Russell Gallop
2010-08-02 19:38:55 UTC
view on stackexchange narkive permalink

Ik wil een variabele vertegenwoordigen als een getal tussen 0 en 1. De variabele is een niet-negatief geheel getal zonder inherente gebondenheid. Ik wijs 0 toe aan 0, maar wat kan ik toewijzen aan 1 of getallen tussen 0 en 1?

Ik zou de geschiedenis van die variabele kunnen gebruiken om de limieten op te geven. Dit zou betekenen dat ik oude statistieken moet herformuleren als het maximum toeneemt. Moet ik dit doen of zijn er andere trucs die ik zou moeten weten?

Hoe zien uw gegevens eruit? Zijn de waarden gebonden?
@spencer Dit forum heet iedereen welkom (IMHO). Je bent helemaal in orde. Kunt u wat meer details over uw gegevens geven? Zijn uw gegevens niet negatief? ...
Mijn gegevens zijn niet-negatief en zijn niet gebonden.
Omdat elke niet-afnemende functie van $ [0, \ infty) \ tot [0, 1] $ het lukt, heb je veel flexibiliteit. Maar sommige methoden zijn beter dan andere, afhankelijk van de toepassing. Wat is uw doel bij het zoeken naar een dergelijke heruitdrukking?
Ik meet inhoud over veel verschillende dimensies en ik wil vergelijkingen kunnen maken in termen van hoe relevant een bepaald stuk inhoud is. Bovendien wil ik waarden weergeven over deze dimensies die verklaarbaar en gemakkelijk te begrijpen zijn.
@Spencer Precies hoe meet u inhoud en "relevantie"? Bijv. Op willekeurige schalen, zoals tellingen, verhoudingen, frequenties van weergaven, correlaties met andere inhoud, enz. Enz. Verschillende soorten metingen profiteren van verschillende soorten heruitdrukkingen.
Ik meet ze op willekeurige schalen. Hoe oud de inhoud is. Hoeveel "punten" een stuk inhoud is ontvangen. Zelfgerapporteerde "interesse" in het domein van de inhoud.
Een van de eenvoudigste transformaties die u zou kunnen gebruiken, is uw gegevens om te zetten in kwantielscores.
Hoe zit het met het gebruik van percentielrangschikkingen?
Acht antwoorden:
#1
+35
Henrik
2010-08-02 19:56:35 UTC
view on stackexchange narkive permalink

Een veel voorkomende truc om dit te doen (bijvoorbeeld in connectionistische modellering) is om de hyperbolische tangens tanh als de 'squashfunctie' te gebruiken. Het past automatisch alle getallen in het interval tussen -1 en 1. Wat in jouw geval het bereik beperkt van 0 tot 1. In r en matlab krijg je het via tanh () .

Een andere squashfunctie is de logistieke functie (met dank aan Simon voor de naam), geleverd door $ f (x) = 1 / (1 + e ^ {- x}) $, die het bereik beperkt van 0 tot 1 (met 0 toegewezen aan .5). Je zou dus het resultaat met 2 moeten vermenigvuldigen en 1 aftrekken om je gegevens in het interval tussen 0 en 1 te passen.

Hier is een eenvoudige R-code die beide functies (tanh in rood, logistiek in blauw) zodat je kunt zien hoe beide squash:

  x <- seq (0,20,0.001) plot (x, tanh (x), pch = ".", col = "red", ylab = "y") punten (x, (1 / (1 + exp (-x))) * 2-1, pch = ".", col = "blue")  
Bedankt voor je antwoord. Dat lost het probleem van bounding op. Voor mijn gegevens gaat het heel snel naar 1 voor mijn gegevens, dus ik denk dat het volgende dat ik moet doen, is om deze informatie te schalen om me te concentreren op het interessante bereik dat ik zou kunnen doen op basis van de geschiedenis ervan zonder angst om de grens te verlaten, gewoon de limiet te raken.
#2
+26
onestop
2011-03-15 15:04:24 UTC
view on stackexchange narkive permalink

Zoals zo vaak was mijn eerste vraag " waarom wil je dit doen", en ik zag dat je dit al beantwoord hebt in de commentaren op de vraag: " Ik meet inhoud in veel verschillende dimensies en ik wil vergelijkingen kunnen maken in termen van hoe relevant een bepaald stuk inhoud is. Daarnaast wil ik waarden weergeven over deze dimensies die verklaarbaar en gemakkelijk te begrijpen zijn. "

Er is geen reden om de gegevens te normaliseren zodat het maximum 1 is en het minimum nul om dit te bereiken, en mijn mening is dat dit in het algemeen een slecht idee zou zijn . De max- of min-waarden kunnen heel gemakkelijk uitschieters zijn die niet representatief zijn voor de verdeling van de populatie. @osknows afscheid opmerking over het gebruik van $ z $ -scores is een veel beter idee . $ z $ -scores (ook wel standaardscores genoemd) normaliseren elke variabele met behulp van zijn standaarddeviatie in plaats van zijn bereik. De standaarddeviatie wordt minder beïnvloed door uitschieters. Om $ z $ -scores te gebruiken, verdient het de voorkeur dat elke variabele een min of meer normale verdeling heeft, of op zijn minst een min of meer symmetrische verdeling heeft (dwz niet erg scheef is), maar indien nodig kun je een geschikte gegevenstransformatie toepassen om dit te bereiken; welke transformatie moet worden gebruikt, kan worden bepaald door de best passende Box-Cox-transformatie te vinden.

dus er is niets te maken met het forceren van de gegevens naar de $ [0, 1] $, en in het algemeen ben ik het eens met standaardisatie als de auteur er echt naar zoekt :) Ik antwoordde voordat de discussie verscheen, dus verwijder waarschijnlijk mijn antwoord als deze is correct :)
Als men zich zorgen maakt over uitschieters, zou men kunnen overwegen om de mediaan absolute deviatie (van de mediaan) te gebruiken in plaats van de standaarddeviatie.Gebruik in R de functie `mad ()`.En als men zich zorgen maakt over scheefheid, kan men de rangorde van de gegevens gebruiken in plaats van de oorspronkelijke waarnemingen.In R zou dit `rank ()` zijn, maar als men dit voor nieuwe gegevens gaat gebruiken, zou `ecdf ()` een beter alternatief zijn (`ecdf (x)` retourneert een nieuwe functie die * in principe * dewaarde $ p $ tot het $ p $ -kwantiel van $ x $, bijv. 0 (werkelijk $ 1 / n $) tot de laagste waarde van $ x $, $ 1 $ tot de hoogste waarde, 0,5 tot de mediaan etc.)
#3
+10
Simon Byrne
2010-08-02 20:20:12 UTC
view on stackexchange narkive permalink

Elke sigmoïde functie zal werken:

erf is geen erg handige functie, mits je hem niet liever als afgeleide wilt gebruiken.
Ik heb uiteindelijk een eenvoudige logistieke functie gebruikt met enkele kleine aanpassingen: (1 / (1 + java.lang.Math.exp (-1 * (factor * i))) - 0,5) * 2. Ik heb een factor 0,05 gekozen dielijkt goed te werken voor i tussen 0 en een paar honderd.
1,0 / (1,0 + exp (-1,69897 * (x-gemiddelde (x)) / sd (x))) is een goede benadering van pnorm
#4
+4
stoplan
2010-08-02 21:49:48 UTC
view on stackexchange narkive permalink

Naast de goede suggesties van Henrik en Simon Byrne, zou je f (x) = x / (x + 1) kunnen gebruiken. Ter vergelijking: de logistieke functie zal de verschillen overdrijven naarmate x groter wordt. Dat wil zeggen, het verschil tussen f (x) en f (x + 1) zal groter zijn met de logistieke functie dan met f (x) = x / (x + 1). Misschien wil je dat effect wel of niet.

#5
+1
terrace
2010-08-02 21:57:34 UTC
view on stackexchange narkive permalink

Er zijn twee manieren om dit te implementeren die ik vaak gebruik. Ik werk altijd met realtime data, dus dit veronderstelt continue input. Hier is wat pseudo-code:

Met behulp van een trainbare minmax:

  definieer functie peak: // behoudt de hoogste waarde die het heeft ontvangen definieer functie via : // behoudt de laagste waarde die het heeft ontvangen define function calibrate: // schakelt tussen of peak () en trough () waarden ontvangen of niet define function scale: // wijst invoerbereik [trough.value () toe aan peak.value ()] to [0.0 to 1.0]  

Deze functie vereist dat u ofwel een initiële trainingsfase uitvoert (door calibrate () te gebruiken) of dat u ofwel opnieuw traint op bepaalde intervallen of volgens bepaalde voorwaarden. Stel je bijvoorbeeld een functie als deze voor:

  definieer functie outBounds (val, thresh): if val > (thresh * peak.value ()) || val < (trough.value () / thresh): calibrate ()  

piek en dal ontvangen normaal geen waarden, maar als outBounds () ontvangt een waarde die meer is dan 1,5 keer de huidige piek of minder dan het huidige dieptepunt gedeeld door 1,5, dan wordt calibrate () aangeroepen waardoor de functie automatisch opnieuw kan kalibreren.

Met een historische minmax:

  var arrayLength = 1000var histArray [arrayLength] definieer historyArray (f): histArray.pushFront (f) // voegt f toe aan het begin van de arraydefine max (array): // zoekt maximum element in histArray [] return maxdefine min (array): // zoekt minimum element in histArray [] retourneert mindefine functie scale: // kaarten invoerbereik [min (histArray) tot max (histArray)] tot [0,0 tot 1,0] main () historyArray (histArray) schaal (min (histArray), max (histArray), histArray [0]) // histArray [0] is het huidige element  
Dit kan allemaal worden geïmplementeerd in Max / MSP / Jitter met de [peak] en [trough] objecten voor het eerste voorbeeld en met [jit.3m] voor het tweede voorbeeld.
#6
+1
osknows
2011-03-15 02:20:55 UTC
view on stackexchange narkive permalink

Mijn eerdere bericht bevat een methode om tussen 0 en 1 te rangschikken. Advies over correlatie van classificatorinvoer

De rangorde die ik heb gebruikt, Tmin / Tmax gebruikt echter het voorbeeld min / max, maar misschien vindt u de populatie min / max geschikter. Zoek ook z-scores op

#7
+1
Chris
2016-08-24 15:04:50 UTC
view on stackexchange narkive permalink

Om aan de andere antwoorden toe te voegen die pnorm suggereren ...

Voor een potentieel optimale methode voor het selecteren van parameters stel ik deze benadering voor pnorm voor.

  1.0 / (1.0 + exp (-1.69897 * (x-mean (x)) / sd (x)))  

pnormish

Dit is in wezen Softmax-normalisatie.

Referentie Pnorm in een mum van tijd

#8
  0
DanB
2011-03-16 05:27:25 UTC
view on stackexchange narkive permalink

Een heel eenvoudige optie is om elk getal in uw gegevens te delen door het grootste getal in uw gegevens. Als u veel kleine getallen heeft en een paar zeer grote, kan dit de informatie mogelijk niet goed overbrengen. Maar het is relatief eenvoudig; als u denkt dat er zinvolle informatie verloren gaat wanneer u de gegevens op deze manier in kaart brengt, kunt u een van de meer geavanceerde technieken proberen die anderen hebben voorgesteld.



Deze Q&A is automatisch vertaald vanuit de Engelse taal.De originele inhoud is beschikbaar op stackexchange, waarvoor we bedanken voor de cc by-sa 2.0-licentie waaronder het wordt gedistribueerd.
Loading...