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?
normalization
Russell Gallop
sumber
sumber
Jawaban:
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
r
danmatlab
Anda menerimanyatanh()
.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+e−x)
Berikut adalah beberapa kode R sederhana yang memplot kedua fungsi (tanh merah, logistik biru) sehingga Anda dapat melihat bagaimana keduanya squash:
sumber
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 zz z -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 .
sumber
mad()
rank()
ecdf()
ecdf(x)
Fungsi sigmoid apa pun akan berfungsi:
sumber
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
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
sumber
Untuk menambah jawaban lain yang menyarankan pnorm ...
Untuk metode yang berpotensi optimal untuk memilih parameter saya sarankan perkiraan ini untuk pnorm.
Ini pada dasarnya Normalisasi Softmax.
Referensi Pnorm dalam keadaan darurat
sumber
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:
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:Menggunakan minmax historis:
sumber
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.
sumber