Làm cách nào để ước tính số lượng các công cụ ước tính MLE trong python khi độ dốc rất nhỏ so với giải pháp tối ưu?


7

Tôi đang khám phá cách mô hình hóa một tập dữ liệu bằng cách sử dụng các phân phối bình thường với cả giá trị trung bình và phương sai được định nghĩa là các hàm tuyến tính của các biến độc lập.

Một cái gì đó như N ~ (f (x), g (x)).

Tôi tạo một mẫu ngẫu nhiên như thế này:

def draw(x):
    return norm(5 * x + 2, 3 *x + 4).rvs(1)[0]

Vì vậy, tôi muốn lấy 5, 2 và 4 làm tham số cho phân phối của mình.

Tôi tạo mẫu của mình:

smp = np.zeros ((100,2))

for i in range(0, len(smp)):
    smp[i][0] = i
    smp[i][1] = draw(i)

Hàm khả năng là:

def lh(p):
    p_loc_b0 = p[0]
    p_loc_b1 = p[1]
    p_scl_b0 = p[2]
    p_scl_b1 = p[3]

    l = 1
    for i in range(0, len(smp)):
        x = smp[i][0]
        y = smp[i][1]
        l = l * norm(p_loc_b0 + p_loc_b1 * x, p_scl_b0 + p_scl_b1 * x).pdf(y)

    return -l

Vì vậy, các tham số cho các hàm tuyến tính được sử dụng trong mô hình được đưa ra trong vectơ 4 biến p.

Sử dụng scipy.opt tối đa hóa, tôi có thể giải quyết các tham số MLE bằng xtol cực thấp và đã đưa ra giải pháp làm điểm bắt đầu:

fmin(lh, x0=[2,5,3,4], xtol=1e-35)

Mà không hoạt động tốt:

Warning: Maximum number of function evaluations has been exceeded.
array([ 3.27491346,  4.69237042,  5.70317719,  3.30395462])

Tăng xtol lên giá trị cao hơn là không tốt.

Vì vậy, tôi cố gắng sử dụng một giải pháp bắt đầu khác xa với giải pháp thực sự:

>>> fmin(lh, x0=[1,1,1,1], xtol=1e-8)
Optimization terminated successfully.
         Current function value: -0.000000
         Iterations: 24
         Function evaluations: 143
array([ 1.,  1.,  1.,  1.])

Điều đó làm tôi suy nghĩ:

PDF phần lớn được tập hợp xung quanh giá trị trung bình và có độ dốc rất thấp chỉ có một vài độ lệch chuẩn so với giá trị trung bình, điều này phải không quá tốt cho các phương pháp số.

Vì vậy, làm thế nào để thực hiện các loại ước lượng số này trong các hàm trong đó độ dốc rất gần với không so với giải pháp?

Câu trả lời:


7

Có một số lý do tại sao bạn đang nhận được kết quả sai. Đầu tiên, bạn nên xem xét sử dụng khả năng đăng nhập thay vì khả năng. Có các vấn đề về số với việc nhân nhiều số nhỏ (hãy tưởng tượng nếu bạn có hàng triệu mẫu, bạn phải nhân hàng triệu số nhỏ cho lhd). Ngoài ra, sử dụng gradient cho các phương pháp tối ưu hóa yêu cầu độ dốc thường dễ dàng hơn khi bạn xử lý khả năng đăng nhập. Nói chung, thật tốt khi có một mục tiêu là tổng chứ không phải là sản phẩm của các biến khi xử lý các vấn đề tối ưu hóa.

Thứ hai, fmin đang sử dụng thuật toán đơn giản Nelder-Mead không có bảo đảm hội tụ theo tài liệu scipy . Điều này có nghĩa là sự hội tụ là hoàn toàn ngẫu nhiên và bạn không nên mong đợi tìm thấy các tham số gần với bản gốc. Để giải quyết vấn đề này, tôi khuyên bạn nên sử dụng một phương pháp dựa trên độ dốc như gốc dốc ngẫu nhiên hoặc BFGS. Vì bạn biết mô hình thế hệ (rvs được phân phối theo Gaussian), bạn có thể viết khả năng và khả năng ghi nhật ký là: phương trình

Trong đó a, b, c và d lần lượt là các tham số mô hình của bạn 5,2,3 và 4. Sau đó lấy gradient theo [a, b, c, d] và đưa nó vào đầu vào chính của fmin_bfss. Lưu ý rằng do phương sai khác nhau, những gì có thể được giải quyết chỉ bằng hồi quy tuyến tính bây giờ là một vấn đề khó khăn hơn.

Cuối cùng, bạn cũng có thể muốn kiểm tra các ô vuông nhỏ nhất trên http://en.wikipedia.org/wiki/Linear_regression#Least-squares_estimation_and_related_t kỹ thuậthttp://en.wikipedia.org/wiki/Heteroscedasticity , nói về vấn đề của bạn và cung cấp một số giải pháp có sẵn.

Chúc may mắn!

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.