Pitanje:
Kako prikazati neograničenu varijablu kao broj između 0 i 1
Russell Gallop
2010-08-02 19:38:55 UTC
view on stackexchange narkive permalink

Želim predstaviti varijablu kao broj između 0 i 1. Varijabla je nenegativni cijeli broj bez inherentne veze. Mapiram 0 do 0, ali što mogu preslikati na 1 ili brojeve između 0 i 1?

Mogao bih upotrijebiti povijest te varijable kako bih pružio ograničenja. To bi značilo da moram ponoviti stare statistike ako se maksimum poveća. Moram li to učiniti ili postoje neki drugi trikovi koje bih trebao znati?

Kako izgledaju vaši podaci? Jesu li vrijednosti vezane?
@spencer Ovaj forum pozdravlja (IMHO) sve. Sasvim si dobro. Možete li molimo malo više detalja o svojim podacima? Jesu li vaši podaci negativni? ...
Moji će podaci biti negativni i neće biti vezani.
Budući da će svaka funkcija smanjenja od $ [0, \ infty) \ do [0, 1] $ učiniti trik, imate veliku fleksibilnost. Ali neke će metode biti bolje od drugih, ovisno o primjeni. Koja je tvoja svrha u traženju takvog ponovnog izražavanja?
Mjerim sadržaj u mnogo različitih dimenzija i želim biti u mogućnosti uspoređivati ​​u smislu koliko je određeni sadržaj relevantan. Uz to, želim prikazati vrijednosti u svim dimenzijama što je objašnjivo i lako razumljivo.
@Spencer Kako točno mjeriš sadržaj i "relevantnost"? Npr., Na proizvoljnim ljestvicama, kao brojevi, proporcije, učestalosti prikaza, korelacije s drugim sadržajem, itd. Itd. Različite vrste mjerenja imaju koristi od različitih vrsta ponovnih izraza.
Mjerim ih na proizvoljnim ljestvicama. Koliko je star sadržaj. Koliko je "bodova" primljeno u sadržaj. "Interes" za domenu sadržaja koji je sam prijavio.
Jedna od najjednostavnijih transformacija koju biste mogli koristiti je pretvaranje podataka u kvantilne rezultate.
Što kažete na upotrebu percentila?
Osam odgovori:
#1
+35
Henrik
2010-08-02 19:56:35 UTC
view on stackexchange narkive permalink

Vrlo čest trik za to (npr. u konekcionističkom modeliranju) je upotreba hiperboličke tangente tanh kao 'funkcije zgnječenja'. Ona automatski uklapa sve brojeve u interval između -1 i 1. Što u vašem slučaju ograničava raspon od 0 do 1. U r i matlab dobivate ga putem tanh () .

Još jedna funkcija squashinga je logistička funkcija (hvala Simonu na imenu), koju pruža $ f (x) = 1 / (1 + e ^ {- x}) $, koja ograničava raspon od 0 do 1 (s 0 preslikanim na .5). Dakle, morali biste pomnožiti rezultat s 2 i oduzeti 1 da biste svoje podatke smjestili u interval između 0 i 1.

Evo nekoliko jednostavnih R kodova koji ucrtavaju oba funkcije (tanh u crvenoj boji, logistička u plavoj), tako da možete vidjeti kako se oba zgnječe:

  x <- seq (0,20,0.001) plot (x, tanh (x), pch = ".", col = "crvena", ylab = "y") točke (x, (1 / (1 + exp (-x))) * 2-1, pch = ".", col = "plava")  
Hvala na odgovoru. To rješava problem ograničavanja. Za moje podatke za moje podatke vrlo brzo ide na 1, pa pretpostavljam da je sljedeća stvar koju moram učiniti skaliranje tih podataka kako bih se koncentrirao na zanimljiv raspon koji bih mogao učiniti na temelju njihove povijesti bez straha od napuštanja veze, samo pogađanja granice.
#2
+26
onestop
2011-03-15 15:04:24 UTC
view on stackexchange narkive permalink

Kao i često, moje prvo pitanje bilo je " zašto to želiš učiniti", tada sam vidio da si na to već odgovorio u komentarima na pitanje: " Mjerim sadržaj u mnogo različitih dimenzija i želim biti u mogućnosti uspoređivati ​​u odnosu na relevantnost određenog dijela sadržaja. Osim toga, želim prikazati vrijednosti u tim dimenzijama koje su objašnjive i lako razumljive. "

Nema razloga za normalizaciju podataka tako da je max 1, a min nula kako bi se to postiglo, a moje mišljenje je da bi to uopće bila loša ideja . Vrijednosti max ili min mogu vrlo lako biti odstupanja koja nisu reprezentativna za raspodjelu stanovništva. @osknows oproštajna primjedba o upotrebi $ z $ -rezultata puno je bolja ideja . $ z $ -bodovi (aka standardni ocjene) normaliziraju svaku varijablu koristeći njezino standardno odstupanje, a ne opseg. Na standardnu ​​devijaciju manje utječu vanzemaljci. Da biste koristili $ z $ -bodove, poželjno je da svaka varijabla ima približno normalnu raspodjelu ili barem ima približno simetričnu raspodjelu (tj. Nije ozbiljno iskrivljena), ali ako je potrebno možete primijeniti neku odgovarajuću transformaciju podataka prvo kako bi se to postiglo; koja bi se transformacija koristila mogla utvrditi pronalaženjem najbolje prikladne Box-Coxove transformacije.

tako da nema nikakve veze s prisiljavanjem podataka na $ [0, 1] $, i općenito se slažem sa standardizacijom ako je autor stvarno traži :) Odgovorio sam prije nego što se rasprava pojavila, pa vjerojatno izbrišite svoj odgovor ako ovo je točno :)
Ako su zabrinuti zbog izvanrednih vrijednosti, mogao bi razmisliti o korištenju medijana apsolutnog odstupanja (od medijane) umjesto standardnog odstupanja.U R koristite funkciju `mad ()`.A ako je netko zabrinut zbog iskrivljenosti, može upotrijebiti redoslijed podataka umjesto izvornih opažanja.U R, to bi bio `rank ()`, ali ako će netko to koristiti na novim podacima, `ecdf ()` bi bila bolja alternativa (`ecdf (x)` vraća novu funkciju koja * u osnovi * dajevrijednost $ p $ na $ p $ -kvantil od $ x $, npr. 0 (stvarno $ 1 / n $) na najnižu vrijednost $ x $, $ 1 $ na najvišu vrijednost, 0,5 na medijan itd.)
#3
+10
Simon Byrne
2010-08-02 20:20:12 UTC
view on stackexchange narkive permalink

Svaka sigmoidna funkcija će raditi:

erf nije vrlo zgodna funkcija, pod uvjetom da ga ne želite radije koristiti za njegov derivat.
Na kraju sam upotrijebio jednostavnu logističku funkciju s nekoliko malih podešavanja: (1 / (1 + java.lang.Math.exp (-1 * (faktor * i))) - 0,5) * 2. Odabrao sam faktor 0,05 kojičini se da dobro radi za i između 0 i nekoliko stotina.
1,0 / (1,0 + exp (-1,69897 * (x-prosjek (x)) / sd (x))) bliska je aproksimacija s pnormom
#4
+4
stoplan
2010-08-02 21:49:48 UTC
view on stackexchange narkive permalink

Uz dobre prijedloge Henrika i Simona Byrnea, mogli biste upotrijebiti f (x) = x / (x + 1). Za usporedbu, logistička funkcija pretjerat će razlike kako x raste. Odnosno, razlika između f (x) i f (x + 1) bit će veća s logističkom funkcijom nego s f (x) = x / (x + 1). Možda želite ili ne želite taj učinak.

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

Postoje dva načina da to implementiram, a koje najčešće koristim. Uvijek radim s podacima u stvarnom vremenu, pa to podrazumijeva kontinuirani unos. Evo nekoliko pseudo-kodova:

Korištenje minmax-a koji se može trenirati:

  define function peak: // zadržava najvišu vrijednost koju je primiodefinirajte funkciju kroz : // zadržava najnižu vrijednost koju je primiodefine function calibrate: // prebacuje primaju li peak () i trough () vrijednosti ili nedefinirati funkcijsku ljestvicu: // preslikava raspon unosa [trough.value () na peak.value ()] do [0,0 do 1,0]  

Ova funkcija zahtijeva da obavite početnu fazu treninga (pomoću calibrate () ) ili da se pretrenirate bilo u određenim intervalima ili prema određenim uvjetima. Na primjer, zamislite funkciju poput ove:

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

vrh i korito obično ne primaju vrijednosti, ali ako outBounds () prima vrijednost koja je više od 1,5 puta veća od trenutnog vrha ili manja od trenutnog korita podijeljena s 1,5, tada se poziva calibrate () što omogućava funkciji automatsku ponovnu kalibraciju.

Korištenje povijesne minmax:

  var arrayLength = 1000var histArray [arrayLength] definirati historyArray (f): histArray.pushFront (f) // dodaje f na početak nizadefine max (array): // pronalazi maksimalan element u histArray [] return maxdefine min (array): // pronalazi minimalni element u histArray [] return mindefine function scale: // mapira ulazni opseg [min (histArray) do max (histArray)] do [0,0 do 1,0] main () historyArray (histArray) skala (min (histArray), max (histArray), histArray [0]) // histArray [0] je trenutni element  
Sve se to može implementirati u Max / MSP / Jitter s objektima [peak] i [trough] za prvi primjer i s [jit.3m] za drugi primjer.
#6
+1
osknows
2011-03-15 02:20:55 UTC
view on stackexchange narkive permalink

Moj raniji post ima metodu za rangiranje između 0 i 1. Savjeti o korelaciji unosa klasifikatora

Međutim, poredak koji sam koristio, Tmin / Tmax koristi uzorak min / max, ali možda ćete smatrati da je populacija min / max prikladnija. Potražite i z ocjene

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

Da biste dodali ostalim odgovorima koji predlažu pnorm ...

Za potencijalno optimalnu metodu odabira parametara predlažem ovu aproksimaciju za pnorm.

  1.0 / (1.0 + exp (-1.69897 * (x-znači (x)) / sd (x)))  

pnormish

Ovo je u osnovi Softmax normalizacija.

Referenca Pnorm u kratkom roku

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

Vrlo jednostavna opcija je dijeljenje svakog broja u vašim podacima s najvećim brojem u vašim podacima. Ako imate mnogo malih i nekoliko vrlo velikih brojeva, ovo možda neće dobro prenijeti informacije. Ali to je relativno lako; ako mislite da se značajne informacije gube kad grafički prikazujete podatke poput ovog, možete isprobati jednu od sofisticiranijih tehnika koje su drugi predložili.



Ova pitanja su automatski prevedena s engleskog jezika.Izvorni sadržaj dostupan je na stackexchange-u, što zahvaljujemo na cc by-sa 2.0 licenci pod kojom se distribuira.
Loading...