Sınırsız bir değişkeni 0 ile 1 arasında sayı olarak gösterme


28

Bir değişkeni 0 ile 1 arasında bir sayı olarak temsil etmek istiyorum. Değişken, doğal bir sınırı olmayan negatif olmayan bir tam sayıdır. 0 - 0 arasında eşlerim, ancak 1 ile 0 arasındaki rakamları ne eşleyebilirim?

Limitleri sağlamak için bu değişkenin geçmişini kullanabilirim. Bu, eğer maksimum artış olursa eski istatistikleri yeniden düzenlemem gerektiği anlamına gelir. Bunu yapmak zorunda mıyım, yoksa bilmem gereken başka numaralar var mı?


6
herhangi bir azaltılmamış fonksiyon hile yapacağından, çok fazla esnekliğe sahipsiniz. Ancak bazı yöntemler uygulamaya bağlı olarak diğerlerinden daha iyi olacaktır. Böyle bir yeniden ifade arayışında amacınız nedir? [0,)[0,1]
whuber

1
İçeriği birçok farklı boyutta ölçüyorum ve verilen bir içerik parçasının ne kadar alakalı olduğu konusunda karşılaştırma yapabilmek istiyorum. Ek olarak, açıklanabilir ve kolayca anlaşılan değerleri bu boyutlarda görüntülemek istiyorum.
Spencer

1
@Spencer Tam olarak içeriği ve "alaka düzeyini" nasıl ölçüyorsunuz? Örneğin, rasgele ölçeklerde, sayım, oran, görüş sıklığı, diğer içeriklerle korelasyon vb. Gibi. Farklı ölçüm türleri, farklı türdeki yeniden ifadelerden yararlanır.
whuber

1
Onları rastgele ölçeklerde ölçüyorum. İçeriğin kaç yaşında olduğu. Bir içerik parçasının kaç "puan" alındığı. İçeriğin alanında kendiliğinden bildirilen "ilgi".
Spencer

2
Kullanabileceğiniz en basit dönüşümlerden biri, verilerinizi nicel puanlara dönüştürmektir.
charles.y.zheng

Yanıtlar:


34

Bunu yapmak için çok yaygın bir püf noktası (örneğin, bağlantısal modellemede) hiperbolik tanjant tanjisini 'squashing fonksiyonu' olarak kullanmaktır . 0 1'e olarak rve matlabbunu yoluyla olsun tanh().

Diğer bir ezme işlevi, sağlanan ve 0 ile 1 arasında (0 ile eşlenen kısıtlayan lojistik işlevidir (ad için Simon sayesinde) . 5). Böylece sonucu 2 ile çarpmanız ve verilerinizi 0 ile 1 arasındaki aralığa sığdırmak için 1'i çıkarmanız gerekir.f(x)=1/(1+ex)

Her iki işlevi de (basitçe kırmızı, mavi, lojistik) gösteren basit R kodudur.

x <- seq(0,20,0.001)
plot(x,tanh(x),pch=".", col="red", ylab="y")
points(x,(1 / (1 + exp(-x)))*2-1, pch=".",col="blue")

Cevabınız için teşekkürler. Bu sınırlama sorununu çözer. Verilerim için verilerim için çok hızlı bir şekilde 1'e gidiyor, bu yüzden sanırım yapmam gereken bir sonraki şey, sınırdan ayrılma korkusu olmadan geçmişine dayanarak yapabileceğim ilginç aralığa odaklanmak için bu bilgiyi ölçeklendirmek olacak. sadece limiti vuruyorum.
Russell Gallop

25

Sık sık, benim ilk sorum “ neden bunu yapmak istiyorsun? ” Olacaktı , daha sonra bunu şu soruya cevap verdiğini gördüm: “ İçeriği birçok farklı boyutta ölçtüm ve olmak istiyorum. Verilen bir içerik parçasının ne kadar alakalı olduğu konusunda karşılaştırmalar yapabiliyorum. Ek olarak, bu boyutlar arasında açıklanabilen ve kolayca anlaşılan değerleri görüntülemek istiyorum.

Verileri normalleştirmek için hiçbir neden yoktur, böylece bunu elde etmek için maks. 1 ve min sıfırdır ve bence bu genel olarak kötü bir fikir olacaktır . Maksimum veya minimum değerler , popülasyon dağılımını temsil etmeyen aykırı değerler olabilir . @osknows hakkında açıklama ayrılık kullanarak -scores çok daha iyi bir fikirdirz . -scores (aka standart puanlar), her değişkeni menzili yerine standart sapmasını kullanarak normalleştirir. Standart sapma aykırı değerlerden daha az etkilenir. kullanmak içinzzz- puanlar, her değişkenin kabaca normal bir dağılıma sahip olması veya en azından kabaca simetrik bir dağılıma sahip olması (yani ciddi şekilde çarpık olmaması) tercih edilir, ancak gerekirse bunu sağlamak için önce uygun bir veri dönüşümü uygulayabilirsiniz ; hangi dönüşümün kullanılacağı en uygun Box-Cox dönüşümü tespit edilerek belirlenebilir .


bu yüzden, verileri e zorlamakla ilgisi yoktur ve genel olarak yazar gerçekten ararsa standardizasyona katılıyorum :) Tartışma ortaya çıkmadan önce cevap verdim, bu yüzden eğer cevabımı sil ise doğrudur :)[0,1]
Dmitrij Celov 15:11

1
Kişi aykırılıklar için endişeleniyorsa, standart sapma yerine medyan mutlak sapmasını (medyandan) kullanmayı düşünebilir. R'de, mad()işlevi kullanın . Ve eğer biri çarpıklıktan endişe duyuyorsa, orijinal gözlemler yerine verilerin saflarını kullanabilir. Ar, bu olurdu rank(), ancak bir yeni veriler üzerinde bu kullanacağız eğer, ecdf()daha iyi bir (alternatif olacaktır ecdf(x)o yeni işlev döner temelde değer veren için ait -quantile örneğin 0 (gerçekten, ) en düşük değeri , en yüksek değeri, 0,5'in ortanca değeri vs.)p x 1 / n x 1ppx1/nx1
Karl Ove Hufthammer

10

Herhangi bir sigmoid işlevi çalışacaktır:


erf, türevi için kullanmak istemediğiniz sürece, çok kullanışlı bir fonksiyon değildir.

Bazı küçük ince ayarlarla basit bir lojistik fonksiyon kullandım: (1 / (1 + java.lang.Math.exp (-1 * (factor * i)))) - 0.5) * 2. 0.05 olan bir faktör seçtim. 0 ile birkaç yüz arasında ben için iyi çalışıyor gibi görünüyor.
Jilles van Gurp

1.0 / (1.0 + exp (-1.69897 * (x-mean (x)) / sd (x))), pnorm'a yakın bir yaklaşımdır
Chris

3

Henrik ve Simon Byrne'ın iyi önerilerine ek olarak, f (x) = x / (x + 1) kullanabilirsiniz. Karşılaştırma yoluyla, lojistik işlevi x büyüdükçe farkları abartır. Yani, f (x) ve f (x + 1) arasındaki fark, lojistik işleviyle f (x) = x / (x + 1) 'den daha büyük olacaktır. Bu etkiyi isteyebilir ya da istemeyebilirsiniz.



1

Pnorm öneren diğer cevaplara eklemek için ...

Parametrelerin seçilmesi için potansiyel olarak optimal bir yöntem için, bu soruna pnorm için yaklaşmayı öneririm.

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

pnormish

Bu aslında Softmax Normalizasyon.

Bir tutam içinde Referans Pnorm


1

Bunu yaygın olarak kullanmamın iki yolu var. Her zaman gerçek zamanlı veriyle çalışıyorum, bu da sürekli girdiyi varsayar. İşte bazı sahte kod:

Eğitilebilir bir minmax kullanmak:

define function peak:
    // keeps the highest value it has received

define function trough:
    // keeps the lowest value it has received

define function calibrate:
    // toggles whether peak() and trough() are receiving values or not

define function scale:
    // maps input range [trough.value() to peak.value()] to [0.0 to 1.0]

Bu işlev, başlangıç ​​eğitim aşamasını (kullanarak calibrate()) gerçekleştirmenizi veya belirli aralıklarla veya belirli koşullara göre yeniden eğitmenizi gerektirir. Örneğin, böyle bir işlevi hayal edin:

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

tepe ve oluk normalde outBounds()değer almaz , ancak geçerli zirvenin 1,5 katından daha fazla veya mevcut oluktan 1,5'e bölünen bir değer alırsa calibrate(), işlevin otomatik olarak yeniden kalibre edilmesine olanak sağlayan denir.

Tarihsel bir minmax kullanarak:

var arrayLength = 1000
var histArray[arrayLength]

define historyArray(f):
    histArray.pushFront(f) //adds f to the beginning of the array

define max(array):
    // finds maximum element in histArray[]
    return max

define min(array):
    // finds minimum element in histArray[]
    return min

define function scale:
    // maps input range [min(histArray) to max(histArray)] to [0.0 to 1.0]

main()
historyArray(histArray)
scale(min(histArray), max(histArray), histArray[0])
// histArray[0] is the current element

Bunların hepsi Max / MSP / Jitter'de ilk örnek için [peak] ve [yalak] nesnelerle ve ikinci örnek için [jit.3m] ile uygulanabilir.
teras

0

Çok basit bir seçenek, verilerinizdeki her sayıyı verilerinizdeki en büyük sayıya bölmektir. Çok küçük sayılarınız ve çok büyük sayılarınız varsa, bu bilgileri iyi aktarmayabilir. Ancak bu nispeten kolaydır; Bu gibi verileri çizdiğinizde anlamlı bilgilerin kaybolduğunu düşünüyorsanız, diğerlerinin önerdiği daha karmaşık tekniklerden birini deneyebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.