การสร้างคุณสมบัติที่ดีที่สุดของกลางวันในโครงข่ายประสาทเทียม


19

ทำงานเกี่ยวกับปัญหาการถดถอยฉันเริ่มคิดเกี่ยวกับการเป็นตัวแทนของคุณสมบัติ "วันของสัปดาห์" ฉันสงสัยว่าวิธีการใดที่จะทำงานได้ดีกว่า:

  • คุณสมบัติเดียว; ค่า 1/7 สำหรับวันจันทร์; 2/7 ในวันอังคาร ...
  • 7 คุณสมบัติ: (1, 0, 0, 0, 0, 0, 0) สำหรับวันจันทร์; (0, 1, 0, 0, 0, 0, 0) สำหรับวันอังคาร ...

เป็นการยากที่จะวัดเนื่องจากความแตกต่างของการกำหนดค่าเครือข่าย (ควรมีฟีเจอร์หกอย่างเพิ่มเติมที่สะท้อนให้เห็นในจำนวนโหนดที่ซ่อนอยู่ที่ฉันเชื่อ)

จำนวนคุณสมบัติทั้งหมดคือประมาณ 20 ฉันใช้ backprop ง่าย ๆ เพื่อเรียนรู้เครือข่ายนิวรัลไปข้างหน้าแบบธรรมดา


สิ่งที่เกี่ยวกับการใช้การเข้ารหัสไบนารีสำหรับวันของสัปดาห์ 3 คุณลักษณะโดยที่ (0, 0, 0) คือวันอาทิตย์ (0, 0, 1) สำหรับวันจันทร์เป็นต้น
Shamoon

สิ่งนี้มีประโยชน์เพิ่มเติมในการลดคุณสมบัติให้มีความหมายมากขึ้นเพื่อลดเวลาในการคำนวณ
Shamoon

คำตอบ:


23

การเป็นตัวแทนครั้งที่สองของคุณเป็นแบบดั้งเดิมสำหรับตัวแปรเด็ดขาดเช่นวันในสัปดาห์

สิ่งนี้เรียกว่าการสร้างตัวแปรจำลองและเป็นวิธีที่ใช้กันอย่างแพร่หลายสำหรับการเข้ารหัสตัวแปรเด็ดขาด ถ้าคุณใช้การเข้ารหัส 1-7 คุณกำลังบอกโมเดลว่าวันที่ 4 และ 5 นั้นคล้ายคลึงกันมากในขณะที่วันที่ 1 และ 7 นั้นแตกต่างกันมาก อันที่จริงแล้ววันที่ 1 และ 7 นั้นคล้ายกันกับวันที่ 4 และ 5 ตรรกะเดียวกันนี้มีไว้สำหรับการเข้ารหัส 0-30 สำหรับวันของเดือน

วันของเดือนนั้นมีเล่ห์เหลี่ยมเล็กน้อยเนื่องจากในขณะที่ทุกสัปดาห์มี 7 วันเหมือนกันไม่ใช่ทุกเดือนมี 30 วันเหมือนกัน: บางเดือนมี 31 วันและบางเดือนมี 28 วัน เนื่องจากทั้งสัปดาห์และเดือนเป็นวัฏจักรคุณสามารถใช้การแปลงฟูริเยร์เพื่อแปลงให้เป็นตัวแปรเชิงเส้นที่ราบเรียบ

ตัวอย่างเช่น ( โดยใช้ R ภาษาการเขียนโปรแกรมที่ฉันเลือก ):

day_of_month = c(1:31, 1:28, 1:30)
day_of_year <- 1:length(day_of_month)
s = sin((2*pi)/30*day_of_month)
c = cos((2*pi)/30*day_of_month)
plot(day_of_month ~ day_of_year)
lines(15*s+15 ~ day_of_year, col='blue')
lines(15*c+15 ~ day_of_year, col='red')
legend(10, 30, c('raw', 'sin', 'cos'), c('black', 'blue', 'red'))

ดิบกับบาปเทียบกับโคไซน์

(ฉันปรับขนาดตัวแปรไซน์ / โคไซน์เป็น 0/30 แทนที่จะเป็น -1/1 เพื่อให้กราฟดูดีขึ้น)

อย่างที่คุณเห็นในขณะที่ตัวแปร "วันสิ้นเดือน" กลับไปที่ศูนย์ในตอนท้ายของแต่ละเดือนการแปลงไซน์และโคไซน์ทำให้การเปลี่ยนผ่านเป็นไปอย่างราบรื่นซึ่งทำให้แบบจำลองรู้ว่าวันที่สิ้นสุดของหนึ่งเดือนนั้นคล้ายคลึงกับ วันที่เริ่มต้นของเดือนถัดไป

คุณสามารถเพิ่มส่วนที่เหลือของข้อกำหนดฟูริเยร์ดังนี้:

for(i in 1:3){
  s = sin((2*pi)/30*day_of_month + 30 * i/4)
  c = cos((2*pi)/30*day_of_month + 30 * i/4)
  lines(15*s+15 ~ day_of_year, col='blue')
  lines(15*c+15 ~ day_of_year, col='red')
}
legend(10, 30, c('raw', 'sin', 'cos'), c('black', 'blue', 'red'))

การแปลงสมบูรณ์

คลื่นไซน์ / โคไซน์แต่ละคู่ทำให้เกิดวงกลม:

m <- lapply(1:4, function(i){
  as.matrix(
    data.frame(
    s = sin((2*pi)/30*day_of_month + 30 * i/4),
    c = cos((2*pi)/30*day_of_month + 30 * i/4)
    )
  )
})
m <- do.call(cbind, m)
pairs(m)

วงกลม หน้านี้มีคำอธิบายที่เป็นประโยชน์อย่างมากเกี่ยวกับวิธีจัดการคลื่นไซน์และโคไซน์


มีเหตุผลเฉพาะที่จะทำเช่นนั้น? ฉันสงสัยว่ามันจะส่งผลต่อการลู่เข้าได้อย่างไร ข้อสงสัยที่สองของฉันคือเมื่อตัวแปรยังคงจัดหมวดหมู่ - สิ่งที่เกี่ยวกับวันของเดือน? (0 - 30)
Oepas Dost

สิ่งเดียวกัน; ใช้ตัวแปรตัวบ่งชี้ การเข้ารหัสครั้งแรกทำให้เกิดความคล้ายคลึงกันซึ่งอาจไม่เหมาะสม เช่นวันอาทิตย์เป็นวันที่แตกต่างจากวันจันทร์จริงหรือ นั่นคือสิ่งที่การเข้ารหัสหมายถึง ...
Emre

@OepasDost หากโพสต์ของฉันตอบคำถามของคุณโปรดลงคะแนนและ / หรือยอมรับได้โดยคลิกเครื่องหมายถูก
Zach

@Zach เหตุใดคุณจึงต้องพิจารณาวันของสัปดาห์ (ที่สามารถเข้ารหัสได้จาก 0 ถึง 6) เป็นหมวดหมู่และวันที่ของเดือนเป็นวัฏจักรลำดับ (ดังนั้นจึงใช้การแปลงฟูริเยร์) และไม่ใช่ทั้งคู่เป็นวัฏจักรตามลำดับและดังนั้นฟูริเยร์จึงแปลงร่างเป็นวันในสัปดาห์เช่นกัน?
ซิป

1
@zipp คุณสามารถใช้ฟูริเยร์สำหรับวันของสัปดาห์ได้เช่นกัน จากประสบการณ์ของฉันค่าหลักของวันในสัปดาห์คือความแตกต่างระหว่างวันธรรมดาและวันหยุดสุดสัปดาห์ซึ่งง่ายมากในการจับภาพด้วยตัวแปรจำลอง (หรือตัวแปรตัวบ่งชี้)
Zach
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.