Hanya ingin tahu apakah ada yang akrab dengan pengelompokan input nominal. Saya telah melihat SOM sebagai solusi tetapi ternyata itu hanya bekerja dengan fitur numerik. Apakah ada ekstensi untuk fitur kategorikal? Secara khusus saya bertanya-tanya tentang 'Days of the Week' sebagai fitur yang mungkin. Tentu saja dimungkinkan untuk mengubahnya menjadi fitur numerik (yaitu Sen - Matahari sesuai dengan nos 1-7) namun kemudian jarak Euclidean antara Matahari dan Sen (1 & 7) tidak akan sama dengan jarak dari Sen ke Sel (1 & 2) ). Setiap saran atau ide akan sangat dihargai.
11
Jawaban:
Latar Belakang:
Cara paling logis untuk mengubah jam adalah menjadi dua variabel yang berayun bolak-balik. Bayangkan posisi ujung jarum jam dari 24 jam. The
x
ayunan posisi bolak-balik tidak sinkron dengany
posisi. Untuk jam 24-jam Anda dapat melakukannya denganx=sin(2pi*hour/24)
,y=cos(2pi*hour/24)
.Anda perlu kedua variabel atau gerakan yang tepat melalui waktu hilang. Hal ini disebabkan oleh fakta bahwa turunan dari dosa atau cos berubah dalam waktu sedangkan
(x,y)
posisi bervariasi dengan lancar saat bergerak di sekitar satuan lingkaran.Akhirnya, pertimbangkan apakah perlu untuk menambahkan fitur ketiga untuk melacak waktu linier, yang dapat dibangun sebagai jam (atau menit atau detik) dari awal catatan pertama atau cap waktu Unix atau yang serupa. Ketiga fitur ini kemudian memberikan proksi untuk progresif siklus dan linear waktu, mis. Anda dapat mengeluarkan fenomena siklus seperti siklus tidur dalam pergerakan manusia dan juga pertumbuhan linear seperti populasi vs waktu.
Contoh jika dilakukan:
Sekarang mari kita coba:
Anda hanya bisa melihat bahwa ada beberapa setelah tengah malam yang termasuk dalam kluster hijau sebelum tengah malam. Sekarang mari kita kurangi jumlah cluster dan tunjukkan bahwa sebelum dan sesudah tengah malam dapat dihubungkan dalam satu cluster secara lebih detail:
Lihat bagaimana gugus biru berisi waktu dari sebelum dan sesudah tengah malam yang dikelompokkan bersama di dalam kluster yang sama ...
Anda dapat melakukan ini untuk waktu, atau hari dalam seminggu, atau minggu dalam sebulan, atau hari dalam sebulan, atau musim, atau apa pun.
sumber
Variabel nominal yang umum adalah kode dummy ketika digunakan dalam SOM (misalnya, satu variabel untuk dengan 1 untuk Senin 0 untuk tidak Senin, yang lain untuk Selasa, dll).
Anda dapat memasukkan informasi tambahan dengan membuat kategori gabungan dari hari yang berdekatan. Misalnya: Senin & Selasa, Selasa & Rabu, dll. Namun, jika data Anda berkaitan dengan perilaku manusia, sering kali lebih bermanfaat untuk menggunakan Weekday dan Weekend sebagai kategori.
sumber
Untuk variabel nominal, pengkodean khas dalam jaringan saraf atau konteks teknik listrik disebut "satu panas" - vektor semua 0s, dengan satu 1 pada posisi yang sesuai untuk nilai untuk variabel. Untuk hari-hari dalam seminggu, misalnya, ada tujuh hari, jadi vektor satu-panas Anda akan panjangnya tujuh. Maka Senin akan direpresentasikan sebagai [1 0 0 0 0 0 0], Selasa sebagai [0 1 0 0 0 0 0], dll.
Seperti yang disiratkan Tim, pendekatan ini dapat digeneralisasikan dengan mudah untuk mencakup vektor fitur boolean yang sewenang-wenang, di mana setiap posisi dalam vektor berhubungan dengan fitur yang diminati dalam data Anda, dan posisinya diatur ke 1 atau 0 untuk menunjukkan ada atau tidaknya itu. fitur.
Setelah Anda memiliki vektor biner, jarak Hamming menjadi metrik alami, meskipun jarak Euclidean juga digunakan. Untuk vektor biner satu-panas, SOM (atau aproksimasi fungsi lainnya) secara alami akan menginterpolasi antara 0 dan 1 untuk setiap posisi vektor. Dalam hal ini, vektor-vektor ini sering diperlakukan sebagai parameter distribusi Boltzmann atau softmax di atas ruang variabel nominal; perlakuan ini memberikan cara untuk menggunakan vektor dalam semacam skenario divergensi KL juga.
Variabel siklik jauh lebih rumit. Seperti yang dikatakan Arthur dalam komentar, Anda harus menentukan metrik jarak sendiri yang menggabungkan sifat siklik variabel.
sumber
Dengan asumsi hari dalam seminggu (dow) berubah dari [0, 6], alih-alih memproyeksikan data ke lingkaran pilihan lain adalah dengan menggunakan:
Untuk memahami alasannya, pertimbangkan dow sebagai jam
perbedaan antara 6 dan 1 bisa 6 - 1 = 5 (pergi searah jarum jam dari 1 ke 6) atau 7 - (6 - 1) = 2. Mengambil min dari kedua opsi harus melakukan trik.
Secara umum Anda dapat menggunakan:
min(abs(diff), range - abs(diff))
sumber
Saya telah berhasil menyandikan Hari dalam seminggu (dan Bulan dalam setahun) sebagai tupel (karena, dosa) seperti yang disorot oleh Whuber dalam komentarnya. Daripada digunakan jarak Euclidean.
Ini adalah contoh kode dalam r:
Jarak Euclidean antara 0 dan 6 sama dengan 0 dan 1.
sumber