Xây dựng hồi quy lượng tử như bài toán lập trình tuyến tính?


8

Làm thế nào để tôi hình thành hồi quy lượng tử như là một vấn đề lập trình tuyến tính? Khi nhìn vào bài toán lượng tử trung vị tôi biết đó là

minimize i=1n|β0+Xiβ1Yi|transforms into minimize i=1neis.t.eiβ0+Xiβ1Yiei(β0+Xiβ1Yi)
nhưng làm cách nào để chuyển đổi thu nhỏ cho các lượng tử khác?


Một số mã R có liên quan có thể được tìm thấy ở đây .
kjetil b halvorsen

Câu trả lời:


14

Bạn sử dụng công cụ ước lượng hồi quy lượng tử

β^(τ):=argminθRKi=1Nρτ(yixiθ).

trong đó τ(0,1) là hằng số được chọn theo đó lượng tử cần được ước tính và hàm ρτ(.) được định nghĩa là

ρτ(r)=r(τI(r<0)).

Để xem mục đích của Trước tiên, hãy xem xét phần còn lại làm đối số, khi chúng được định nghĩa là . Do đó, tổng trong bài toán tối thiểu hóa có thể được viết lại thànhρτ(.)ϵi=yixiθ

i=1Nρτ(ϵi)=i=1Nτ|ϵi|I[ϵi0]+(1τ)|ϵi|I[ϵi<0]

sao cho phần dư dương liên quan đến quan sát phía trên đường hồi quy lượng tử được đề xuất được cho trọng số của trong khi phần dư âm liên quan đến quan sát bên dưới đường hồi quy lượng tử được đề xuất có trọng số với .yixiθτyixiθ(1τ)

Trực giác:

Với phần dư dương và âm bị "trừng phạt" với cùng trọng số và số lượng quan sát bằng nhau ở trên và dưới "đường" một cách tối ưu, do đó, dòng là hồi quy trung bình "hàng".τ=0.5xiβ^

Khi mỗi phần dư dương có trọng số gấp 9 lần phần dư âm với trọng số và do đó, tối ưu cho mọi quan sát trên "dòng" khoảng 9 sẽ được đặt dưới dòng. Do đó "đường" đại diện cho định lượng 0,9. (Để biết một tuyên bố chính xác về điều này, hãy xem THM. 2.2 và Hệ quả 2.1 trong Koenker (2005) "Hồi quy lượng tử")τ=0.91τ=0.1xiβ^

Hai trường hợp được minh họa trong các ô này. Bảng bên trái và bảng bên phải .τ=0.5τ=0.9

hàm rho tau = 0,5 và tau = 0,9

Các chương trình tuyến tính chủ yếu được phân tích và giải quyết bằng cách sử dụng mẫu chuẩn

(1)  minz  cz  subject to Az=b,z0

Để đi đến một chương trình tuyến tính ở dạng chuẩn, vấn đề đầu tiên là trong một chương trình như vậy (1) tất cả các biến mà việc tối thiểu hóa được thực hiện phải là dương. Để đạt được phần dư này được phân tách thành phần dương và phần âm bằng cách sử dụng các biến chùng:z

ϵi=uivi

trong đó phần dương và là phần âm. Tổng các phần dư được gán bởi hàm kiểm tra sau đó được xem làui=max(0,ϵi)=|ϵi|I[ϵi0]vi=max(0,ϵi)=|ϵi|I[ϵi<0]

i=1Nρτ(ϵi)=i=1Nτui+(1τ)vi=τ1Nu+(1τ)1Nv,

trong đó và và là vectơ tất cả các tọa độ bằng .u=(u1,...,uN)v=(v1,...,vN)1NN×11

Phần dư phải thỏa mãn các ràng buộcN

yixiθ=ϵi=uivi

Điều này dẫn đến việc xây dựng như một chương trình tuyến tính

minθRK,uR+N,vR+N{τ1Nu+(1τ)1Nv|yi=xiθ+uivi,i=1,...,N},

như đã nêu trong Koenker (2005) phương trình "Hồi quy lượng tử" trang 10 (1.20).

Tuy nhiên, điều đáng chú ý là vẫn không bị hạn chế là dương theo yêu cầu trong chương trình tuyến tính ở dạng chuẩn (1). Do đó một lần nữa phân hủy thành phần tích cực và tiêu cực được sử dụngθR

θ=θ+θ

trong đó một lần nữa là phần dương và là phần âm. Các ràng buộc sau đó có thể được viết làθ+=max(0,θ)θ=max(0,θ)N

y:=[y1yN]=[x1xN](θ+θ)+INuINv,

trong đó .IN=diag{1N}

Tiếp theo xác định và ma trận thiết kế lưu trữ dữ liệu trên các biến độc lập nhưb:=yX

X:=[x1xN]

Để viết lại ràng buộc:

b=X(θ+θ)+INuINv=[X,X,IN,IN][θ+θuv]

Xác định ma trận(N×2K+2N)

A:=[X,X,IN,IN]
và giới thiệu và như biến trên đó để giảm thiểu vì vậy họ là một phần của để getθ+θz

b=A[θ+θuv]=Az

Bởi vì và chỉ ảnh hưởng đến vấn đề tối thiểu hóa thông qua ràng buộc a của thứ nguyên phải được giới thiệu như một phần của vectơ đồng biến có thể được định nghĩa một cách thích hợp làθ+θ02K×1c

c=[0τ1N(1τ)1N],

do đó, đảm bảo rằngcz=0(θ+θ)=0+τ1Nu+(1τ)1Nv=i=1Nρτ(ϵi).

Do đó và sau đó được xác định và chương trình như được nêu trong hoàn toàn được chỉ định.c,Ab(1)

Điều này có lẽ được tiêu hóa tốt nhất bằng cách sử dụng một ví dụ. Để giải quyết vấn đề này trong R, hãy sử dụng gói quantreg của Roger Koenker. Dưới đây cũng là minh họa về cách thiết lập chương trình tuyến tính và giải quyết với một bộ giải cho các chương trình tuyến tính:

base=read.table("http://freakonometrics.free.fr/rent98_00.txt",header=TRUE)
attach(base)
library(quantreg)
library(lpSolve)
tau <- 0.3


# Problem (1) only one covariate
X <- cbind(1,base$area)
K <- ncol(X)
N <- nrow(X)

A <- cbind(X,-X,diag(N),-diag(N))
c <- c(rep(0,2*ncol(X)),tau*rep(1,N),(1-tau)*rep(1,N))
b <- base$rent_euro
const_type <- rep("=",N)

linprog <- lp("min",c,A,const_type,b)
beta <- linprog$sol[1:K] -  linprog$sol[(1:K+K)]
beta
rq(rent_euro~area, tau=tau, data=base)


# Problem (2) with 2 covariates
X <- cbind(1,base$area,base$yearc)
K <- ncol(X)
N <- nrow(X)

A <- cbind(X,-X,diag(N),-diag(N))
c <- c(rep(0,2*ncol(X)),tau*rep(1,N),(1-tau)*rep(1,N))
b <- base$rent_euro
const_type <- rep("=",N)

linprog <- lp("min",c,A,const_type,b)
beta <- linprog$sol[1:K] -  linprog$sol[(1:K+K)]
beta
rq(rent_euro~ area + yearc, tau=tau, data=base)

bạn có phiền khi giải thích rằng giảm thiểu bằng lời nói không ... Tôi hoàn toàn không thể hiểu được
machazthegamer

Tôi sẽ mở rộng sự kiên nhẫn, các chỉnh sửa đang đến :)
Jesper cho Tổng thống

Hỏi theo dõi câu hỏi ngay bây giờ nếu một cái gì đó cần công phu.
Jesper cho Tổng thống

4

Tôi viết lại mã của Jesper Hybel trong Python bằng cvxopt. Tôi sẽ đăng nó ở đây trong trường hợp người khác cũng cần điều này trong Python.

import pandas as pd
import io
import requests
import numpy as np
url="http://freakonometrics.free.fr/rent98_00.txt"
s=requests.get(url).content
base=pd.read_csv(io.StringIO(s.decode('utf-8')), sep='\t')


tau = 0.3

from cvxopt import matrix, solvers

X = pd.DataFrame(columns=[0,1])
X[1] = base["area"] #data points for independent variable area
X[2] = base["yearc"] #data points for independent variable year
X[0] = 1 #intercept

K = X.shape[1]
N = X.shape[0]

# equality constraints - left hand side

A1 = X.to_numpy() # intercepts & data points - positive weights
A2 = X.to_numpy() * - 1 # intercept & data points - negative weights
A3 = np.identity(N) # error - positive
A4 = np.identity(N)*-1 # error - negative

A = np.concatenate((A1,A2,A3,A4 ), axis= 1) #all the equality constraints 

# equality constraints - right hand side
b = base["rent_euro"].to_numpy()

#goal function - intercept & data points have 0 weights
#positive error has tau weight, negative error has 1-tau weight
c = np.concatenate((np.repeat(0,2*K), tau*np.repeat(1,N), (1-tau)*np.repeat(1,N) ))

#converting from numpy types to cvxopt matrix

Am = matrix(A)
bm = matrix(b)
cm = matrix(c)

# all variables must be greater than zero
# adding inequality constraints - left hand side
n = Am.size[1]
G = matrix(0.0, (n,n))
G[::n+1] = -1.0

# adding inequality constraints - right hand side (all zeros)
h = matrix(0.0, (n,1))

#solving the model
sol = solvers.lp(cm,G,h,Am,bm, solver='glpk')

x = sol['x']

#both negative and positive components get values above zero, this gets fixed here
beta = x[0:K] - x[K :2*K]

print(beta)
```

Cảm ơn, bản dịch của bạn sang Python đã giúp tôi rất nhiều. Ghkhông xuất hiện trong mã R gốc hoặc trong phần viết của Jesper. Đây có phải là những tạo tác về cách CVXOPT yêu cầu các vấn đề được xây dựng, hoặc chúng có ẩn trong bất kỳ bộ giải LP nào không? Trong trường hợp của tôi, tôi đã gặp một chướng ngại vật khi cố gắng chạy với N = 50.000. Gtrở thành một ma trận vuông lớn trong trường hợp này. Tôi đang xem xét sử dụng một bộ giải LP phân tán như Spark có, nhưng có thể sử dụng LP cho hồi quy lượng tử trên thang dữ liệu này là không dễ sử dụng.
peace_within_reach

Theo dõi nhận xét trước đây của tôi: Tôi đã có thể chạy quantreg rqthói quen với 15 triệu hàng dữ liệu. Tôi đã rất ấn tượng rằng bất kỳ phương pháp dựa trên lập trình tuyến tính nào cũng có thể xử lý nhiều dữ liệu đó. Tuy nhiên, trong trường hợp của tôi (ước tính lượng tử rất cao), cần phải sử dụng nhiều dữ liệu hơn thế. Tôi tìm thấy rqcuộn cảm khi tôi sử dụng 20 triệu hàng trở lên. Lỗi là long vectors are not supported in .Cdo các vectơ trở nên quá dài. Đối với bất kỳ ai trong tình huống tương tự, phần mềm tốt nhất tôi tìm thấy để hồi quy lượng tử trên dữ liệu lớn là LightGBM của Microsoft (tăng cường độ dốc)
peace_within_reach

1
Có, G và h chỉ dành cho công thức CVXOPT. Bạn cũng sẽ tìm thấy chúng nếu bạn đang đọc tài liệu CVXOPT. Cách tiếp cận trong CVXOPT là các ràng buộc đẳng thức được lưu trữ trong một ma trận (A) và các ràng buộc bất đẳng thức trong một (G) khác. Điều tương tự cũng xảy ra với ma trận bên phải (h).
Mate Uzsoki

2
Nếu bạn cần hiệu suất, điều quan trọng là sử dụng solver = 'glpk' - nó thay đổi tốc độ rất nhiều. Nó cũng có thể là một ý tưởng tốt để thử nghiệm với người giải quyết khác để xem nếu họ cho bạn kết quả nhanh hơn.
Mate Uzsoki
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.