Câu trả lời:
Bạn sử dụng công cụ ước lượng hồi quy lượng tử
trong đó 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à
Để 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
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 .
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".
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ử")
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 .
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
Để đ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:
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à
trong đó và và là vectơ tất cả các tọa độ bằng .
Phần dư phải thỏa mãn các ràng buộc
Điều này dẫn đến việc xây dựng như một chương trình tuyến tính
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
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à
trong đó .
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ư
Để viết lại ràng buộc:
Xác định ma trận
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à
do đó, đảm bảo rằng
Do đó và sau đó được xác định và chương trình như được nêu trong hoàn toàn được chỉ định.
Đ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)
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)
```
G
và h
khô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. G
trở 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.
quantreg
rq
thó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 rq
cuộ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 .C
do 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)