Cara merepresentasikan variabel tidak terikat sebagai angka antara 0 dan 1

28

Saya ingin mewakili variabel sebagai angka antara 0 dan 1. Variabelnya adalah bilangan bulat non-negatif tanpa batas yang melekat. Saya memetakan 0 hingga 0 tetapi apa yang dapat saya petakan ke 1 atau angka antara 0 dan 1?

Saya bisa menggunakan sejarah variabel itu untuk memberikan batasan. Ini berarti saya harus menyatakan kembali statistik lama jika maksimum meningkat. Apakah saya harus melakukan ini atau ada trik lain yang harus saya ketahui?

Russell Gallop
sumber
6
Karena setiap fungsi nececreasing dari akan melakukan triknya, Anda memiliki banyak fleksibilitas. Tetapi beberapa metode akan lebih baik daripada yang lain, tergantung pada aplikasi. Apa tujuan Anda dalam mencari ekspresi ulang seperti itu? [0,)[0,1]
whuber
1
Saya mengukur konten di berbagai dimensi dan saya ingin dapat membuat perbandingan dalam hal seberapa relevan konten yang diberikan. Selain itu, saya ingin menampilkan nilai di dimensi ini yang dapat dijelaskan dan mudah dipahami.
Spencer
1
@Spencer Persisnya bagaimana Anda mengukur konten dan "relevansi"? Misalnya, pada skala sewenang-wenang, seperti penghitungan, proporsi, frekuensi tampilan, korelasi dengan konten lain, dll. Berbagai jenis pengukuran mendapat manfaat dari berbagai jenis ekspresi ulang.
whuber
1
Saya mengukur mereka pada skala yang berubah-ubah. Berapa umur kontennya. Berapa banyak "poin" konten yang diterima. "Minat" yang dilaporkan sendiri dalam domain konten.
Spencer
2
Salah satu transformasi paling sederhana yang dapat Anda gunakan adalah untuk mengubah data Anda menjadi skor kuantil.
charles.y.zheng

Jawaban:

34

Trik yang sangat umum untuk melakukannya (misalnya, dalam pemodelan koneksionis) adalah dengan menggunakan tanh tangen hiperbolik sebagai 'fungsi squashing ". Ini secara otomatis memasukkan semua angka ke dalam interval antara -1 dan 1. Yang dalam kasus Anda membatasi rentang dari 0 hingga 1. Masuk rdan matlabAnda menerimanya tanh().

Fungsi squashing lainnya adalah fungsi logistik (terima kasih kepada Simon untuk namanya), yang disediakan oleh , yang membatasi rentang dari 0 hingga 1 (dengan 0 yang dipetakan ke 0,5). Jadi, Anda harus mengalikan hasilnya dengan 2 dan kurangi 1 agar sesuai dengan data Anda ke dalam interval antara 0 dan 1.f(x)=1/(1+ex)

Berikut adalah beberapa kode R sederhana yang memplot kedua fungsi (tanh merah, logistik biru) sehingga Anda dapat melihat bagaimana keduanya squash:

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")
Henrik
sumber
Terima kasih atas jawaban anda. Itu memecahkan masalah ikatan. Untuk data saya, data saya menjadi 1 sangat cepat untuk data saya, jadi saya kira hal berikutnya yang perlu saya lakukan adalah menskala informasi ini untuk berkonsentrasi pada rentang yang menarik yang bisa saya lakukan berdasarkan sejarahnya tanpa takut meninggalkan batas, hanya memukul batas.
Russell Gallop
25

Seperti sering, pertanyaan pertama saya adalah " mengapa Anda ingin melakukan ini", maka saya melihat Anda sudah menjawab ini dalam komentar untuk pertanyaan: " Saya mengukur konten di berbagai dimensi dan saya ingin menjadi dapat membuat perbandingan dalam hal seberapa relevan konten yang diberikan. Selain itu, saya ingin menampilkan nilai di dimensi ini yang dapat dijelaskan dan mudah dipahami. "

Tidak ada alasan untuk menormalkan data sehingga maks adalah 1 dan min adalah nol untuk mencapai ini, dan pendapat saya adalah bahwa ini akan menjadi ide yang buruk secara umum . Nilai maksimum atau minimum bisa dengan mudah berupa outlier yang tidak mewakili distribusi populasi. @osknows berpisah tentang penggunaan nilaiz adalah ide yang jauh lebih baik . skor (alias skor standar) menormalkan setiap variabel menggunakan standar deviasi daripada rentangnya. Deviasi standar kurang dipengaruhi oleh outlier. Untuk menggunakan zzz-nilai, lebih disukai bahwa masing-masing variabel memiliki distribusi normal, atau setidaknya memiliki distribusi simetris kasar (yaitu tidak sangat condong) tetapi jika perlu Anda dapat menerapkan beberapa transformasi data yang sesuai terlebih dahulu untuk mencapai ini; transformasi mana yang akan digunakan dapat ditentukan dengan menemukan transformasi Box-Cox yang paling pas .

onestop
sumber
[0,1]
1
mad()rank()ecdf()ecdf(x)ppx1/nx1
Karl Ove Hufthammer
10

Fungsi sigmoid apa pun akan berfungsi:

  • Bagian atas dari fungsi logistik (kalikan dengan 2, kurangi 1)
  • Fungsi kesalahan
  • tanh, seperti yang disarankan oleh Henrik.
Simon Byrne
sumber
erf bukanlah fungsi yang sangat praktis, asalkan Anda tidak ingin menggunakannya untuk turunannya.
Saya akhirnya menggunakan fungsi logistik sederhana dengan beberapa tweak kecil: (1 / (1 + java.lang.Math.exp (-1 * (faktor * i))) - 0,5) * 2. Saya memilih faktor 0,05 yang tampaknya bekerja dengan baik untuk saya antara 0 dan beberapa ratus.
Jilles van Gurp
1.0 / (1.0 + exp (-1.69897 * (x-mean (x)) / sd (x))) adalah pendekatan yang dekat dengan pnorm
Chris
3

Selain saran yang bagus dari Henrik dan Simon Byrne, Anda bisa menggunakan f (x) = x / (x +1). Sebagai perbandingan, fungsi logistik akan membesar-besarkan perbedaan ketika x tumbuh lebih besar. Artinya, perbedaan antara f (x) dan f (x + 1) akan lebih besar dengan fungsi logistik daripada dengan f (x) = x / (x + 1). Anda mungkin atau mungkin tidak ingin efek itu.


sumber
1

Posting saya sebelumnya memiliki metode untuk peringkat antara 0 dan 1. Saran tentang korelasi input classifier

Namun, peringkat yang saya gunakan, Tmin / Tmax menggunakan sampel min / max tetapi Anda mungkin menemukan populasi min / max lebih tepat. Lihat juga skor z

osknows
sumber
1

Untuk menambah jawaban lain yang menyarankan pnorm ...

Untuk metode yang berpotensi optimal untuk memilih parameter saya sarankan perkiraan ini untuk pnorm.

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

pnormish

Ini pada dasarnya Normalisasi Softmax.

Referensi Pnorm dalam keadaan darurat

Chris
sumber
1

Ada dua cara untuk mengimplementasikan ini yang saya gunakan secara umum. Saya selalu bekerja dengan data realtime, jadi ini mengasumsikan input terus menerus. Inilah beberapa kode semu:

Menggunakan minmax yang bisa dilatih:

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]

Fungsi ini mengharuskan Anda melakukan fase pelatihan awal (menggunakan calibrate()) atau melatih kembali baik pada interval tertentu atau sesuai dengan kondisi tertentu. Misalnya, bayangkan fungsi seperti ini:

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

puncak dan palung biasanya tidak menerima nilai, tetapi jika outBounds()menerima nilai yang lebih dari 1,5 kali puncak saat ini atau kurang dari palung saat ini dibagi dengan 1,5, maka calibrate()disebut yang memungkinkan fungsi untuk melakukan kalibrasi ulang secara otomatis.

Menggunakan minmax historis:

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
teras
sumber
Ini semua dapat diimplementasikan dalam Max / MSP / Jitter dengan objek [puncak] dan [palung] untuk contoh pertama dan dengan [jit.3m] untuk contoh kedua.
teras
0

Opsi yang sangat sederhana adalah membagi setiap angka dalam data Anda dengan angka terbesar dalam data Anda. Jika Anda memiliki banyak jumlah kecil dan beberapa yang sangat besar, ini mungkin tidak memberikan informasi dengan baik. Tapi itu relatif mudah; jika Anda merasa informasi yang bermakna hilang ketika Anda membuat grafik data seperti ini, Anda bisa mencoba salah satu teknik yang lebih canggih yang disarankan orang lain.

DanB
sumber