วิธีแก้ค่าเบี่ยงเบนสัมบูรณ์อย่างน้อยที่สุดด้วยวิธีซิมเพล็กซ์?


12

argminwL(w)=i=1n|yiwTx|

mini=1nui

uixTwyii=1,,n

ui(xTwyi)i=1,,n

แต่ฉันไม่มีความคิดที่จะแก้มันทีละขั้นตอนเพราะฉันเป็นมือใหม่ที่ LP คุณมีความคิดใด ๆ ขอบคุณล่วงหน้า!

แก้ไข:

นี่คือขั้นตอนล่าสุดที่ฉันได้มาถึงปัญหานี้ ฉันพยายามที่จะแก้ปัญหาตามหมายเหตุนี้:

ขั้นตอนที่ 1: กำหนดเป็นรูปแบบมาตรฐาน

minZ=i=1nui

xTwui+s1=yii=1,,n

xTw+ui+s2=yii=1,,n

ภายใต้s10;s20;ui0 i=1,...,n

ขั้นตอนที่ 2: สร้าง tableau เริ่มต้น

           |      |    0      |    1   |  0  |   0   |   0    
 basic var | coef |  $p_0$    |  $u_i$ |  W  | $s_1$ | $s_2$ 
      $s_1$| 0    |  $y_i$    |   -1   |  x  |   1   |   0
      $s_2 | 0    |  $-y_i$   |    1   |  x  |   0   |   1
      z    |      |    0      |    -1  |  0  |   0   |   0

ขั้นตอนที่ 3: เลือกตัวแปรพื้นฐาน

uiเลือกเป็นตัวแปรฐานอินพุต นี่เป็นปัญหา เมื่อเลือกตัวแปรฐานการส่งออกเป็นที่ชัดเจนy_iตามหมายเหตุถ้าปัญหามีวิธีแก้ปัญหามากมายyi/1=yi/1=yiyi0

ฉันหลงทางโดยสิ้นเชิงที่นี่ ฉันสงสัยว่ามีอะไรผิดปกติหรือไม่และฉันควรทำตามขั้นตอนต่อไปนี้อย่างไร


2
ในทางปฏิบัติคุณใช้โปรแกรมเชิงเส้นแก้แทนการเขียนของคุณเอง ฉันขอแนะนำ gurobi
Matthew Drury

1
@ MatthewDrury ขอบคุณสำหรับการตอบกลับ แต่ฉันอยากรู้ว่า LP ทำงานอย่างไรในปัญหานี้แทนที่จะแค่ตอบคำถาม
southdoor

1
คุณรู้หรือไม่ว่า Google 'วิธีการซิมเพล็กซ์' หรือไม่?

2
โปรแกรมเชิงเส้นเป็นเพียงการกำหนดปัญหาของคุณในแง่ของการเพิ่ม (หรือลดขนาด) ของฟังก์ชันเชิงเส้นเป้าหมายภายใต้ข้อ จำกัด เชิงเส้นบางอย่าง มันไม่ได้ "แก้ปัญหา" ตัวเอง มีอัลกอริทึมมากมายที่แก้ปัญหาโปรแกรมสูตรพิเศษเหล่านี้หนึ่งในโปรแกรมที่ใช้กันมากที่สุดคือ Simplex
Łukasz Grad

1
@fcop ใช่แน่นอนฉันได้อ่านบันทึกย่อของวิธีการ simplex แต่ฉันไม่รู้ว่าจะสร้างปัญหานี้ได้อย่างไร เป็นตัวอย่างในบันทึกเหล่านั้นง่ายมากและเฉพาะเจาะจง ฉันไม่สามารถหาหนึ่งเริ่มต้นด้วยปัญหาทั่วไป ฉันใช้เวลาสองคืนในปัญหานี้แล้ว แต่ก็ยังสับสนอยู่ ขอโทษ
southdoor

คำตอบ:


5

คุณต้องการตัวอย่างสำหรับการแก้ค่าเบี่ยงเบนสัมบูรณ์อย่างน้อยที่สุด ฉันจะแสดงให้คุณเห็นการใช้งานอย่างง่ายในการถดถอยแบบ Quantile เป็นลักษณะทั่วไปของการเบี่ยงเบนสัมบูรณ์อย่างน้อยที่สุดซึ่งเป็นกรณีของ quantile 0.5 ดังนั้นฉันจะแสดงวิธีแก้ปัญหาการถดถอยแบบควอไทล์ จากนั้นคุณสามารถตรวจสอบผลลัพธ์ด้วยquantregแพ็คเกจR :

rq_LP  <-  function(x, Y, r=0.5, intercept=TRUE) {
    require("lpSolve")
    if (intercept) X  <-  cbind(1, x) else X <-  cbind(x)
    N   <-  length(Y)
    n  <-  nrow(X)
    stopifnot(n == N)
    p  <-  ncol(X)
    c  <-  c(rep(r, n), rep(1-r, n), rep(0, 2*p))  # cost coefficient vector
    A  <- cbind(diag(n), -diag(n), X, -X)
    res  <-  lp("min", c, A, "=", Y, compute.sens=1)
### Desempaquetar los coefs:
    sol <- res$solution
    coef1  <-  sol[(2*n+1):(2*n+2*p)]
    coef <- numeric(length=p)
    for (i in seq(along=coef)) {
         coef[i] <- (if(coef1[i]<=0)-1 else +1) *  max(coef1[i], coef1[i+p])
    }
    return(coef)
    }

จากนั้นเราจะใช้มันในตัวอย่างง่ายๆ:

library(robustbase)
data(starsCYG)
Y  <- starsCYG[, 2]
x  <- starsCYG[, 1]
rq_LP(x, Y)
[1]  8.1492045 -0.6931818

quantregแล้วคุณเองสามารถจะตรวจสอบด้วย


2
+1 ฉันเป็นแฟนตัวยงของการทำสิ่งต่าง ๆ ด้วยตนเองและเปรียบเทียบแล้ว!
Haitao Du

3
สำหรับโพสต์ที่มีคำอธิบายเพิ่มเติมเล็กน้อยดูการถดถอยเชิงปริมาณ
หยุดคำถามปิดเร็ว

2

การเขียนโปรแกรมเชิงเส้นสามารถวางนัยกับการเพิ่มประสิทธิภาพนูนซึ่งนอกเหนือจาก simplex, อัลกอริทึมที่เชื่อถือได้มากขึ้นมีอยู่

ฉันขอแนะนำให้คุณตรวจสอบ The Convex Optimization Book และ CVX toolbox ที่จัดเตรียมไว้ ที่ซึ่งคุณสามารถกำหนดค่าเบี่ยงเบนสัมบูรณ์อย่างน้อยที่สุดด้วยการทำให้เป็นมาตรฐาน

https://web.stanford.edu/~boyd/cvxbook/bv_cvxbook.pdf

http://cvxr.com/cvx/


2
ขอบคุณสำหรับคำตอบ. แต่เมื่อฉันพยายามค้นหาคำว่า "วิธี simplex" ในหนังสือฉันไม่สามารถหาได้ และกล่องเครื่องมือ CVX เป็นเพียงเครื่องมือสำหรับรับอินพุตเป็นปัญหา LP และเรียกใช้อัลกอริทึม แต่สิ่งที่ฉันต้องการจริงๆคือวิธีที่อัลกอริทึมทำงานในปัญหานี้ ไม่ว่าผลลัพธ์สุดท้ายหรือวิธีการกำหนดปัญหา แต่ขั้นตอนในการรับผล ขอบคุณ
southdoor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.