Nối hai đường cong với hồi quy tuyến tính / phi tuyến tính


8

Tôi cần ghép hai đường cong (cả hai nên thuộc các hàm khối) vào một tập hợp các điểm với JuMP.

Tôi đã thực hiện khớp một đường cong, nhưng tôi đang vật lộn để ghép 2 đường cong vào cùng một tập dữ liệu.

Tôi nghĩ rằng nếu tôi có thể phân phối điểm thành các đường cong - vì vậy nếu mỗi điểm chỉ có thể được sử dụng một lần - tôi có thể làm như dưới đây, nhưng nó không hoạt động. (Tôi biết rằng tôi có thể sử dụng những thứ phức tạp hơn nhiều, tôi muốn giữ cho nó đơn giản.)

Đây là một phần của mã hiện tại của tôi:

# cubicFunc is a two dimensional array which accepts cubicFunc[x,degree]

@variable(m, mult1[1:4]) // 0:3 because it's cubic
@variable(m, mult2[1:4]) // 0:3 because it's cubic

@variable(m, 0 <= includeIn1[1:numOfPoints] <= 1, Int)
@variable(m, 0 <= includeIn2[1:numOfPoints] <= 1, Int)

# some kind of hack to force one of them to 0 and other one to 1
@constraint(m, loop[i in 1:numOfPoints], includeIn1[i] + includeIn2[i] == 1)

@objective(m, Min, sum( (yPoints - cubicFunc*mult1).*includeIn1 .^2 ) + sum( (yPoints - cubicFunc*mult2).*includeIn2 .^2 ))

Nhưng nó đưa ra nhiều lỗi khác nhau tùy thuộc vào những gì tôi đang cố gắng; *includeIn1và, .*includeIn1không hoạt động, tôi đã cố gắng thực hiện thông qua @NLobjectivenhưng nó đã cho tôi khoảng 50 dòng lỗi, v.v.

Ý tưởng của tôi có thực tế không? Tôi có thể làm cho nó vào mã?

Bất kỳ trợ giúp sẽ được đánh giá cao. Cảm ơn rât nhiều.


Bạn vui lòng gửi hoặc liên kết đến dữ liệu?
James Phillips

1
@JamesPhillips ofc, x nằm trong phạm vi [0,10] vàyPoints = [ 3, 6, 5, 7, 3, 3, 1, 0, 4, 1]
grtnh

Câu trả lời:


4

Bạn có thể viết ra vấn đề, ví dụ như thế này:

using JuMP, Ipopt

m = Model(with_optimizer(Ipopt.Optimizer))

@variable(m, mult1[1:4])
@variable(m, mult2[1:4])
@variable(m, 0 <= includeIn1[1:numOfPoints] <= 1)
@variable(m, 0 <= includeIn2[1:numOfPoints] <= 1)

@NLconstraint(m, loop[i in 1:numOfPoints], includeIn1[i] + includeIn2[i] == 1)

@NLobjective(m, Min, sum(includeIn1[i] * (yPoints[i] - sum(cubicFunc[i,j]*mult1[j] for j in 1:4)) ^2 for i in 1:numOfPoints) +
                     sum(includeIn2[i] * (yPoints[i] - sum(cubicFunc[i,j]*mult2[j] for j in 1:4)) ^2 for i in 1:numOfPoints))

optimize!(m)

Đưa ra các ràng buộc includeIn1includeIn2sẽ 1hoặc 0tối ưu (nếu chúng không phải là điều này có nghĩa là việc bạn gán điểm nào không quan trọng), vì vậy chúng tôi không phải buộc chúng là nhị phân. Ngoài ra tôi sử dụng bộ giải phi tuyến tính vì vấn đề dường như không thể định dạng lại thành nhiệm vụ tối ưu hóa tuyến tính hoặc bậc hai.

Tuy nhiên, tôi chỉ đưa ra đoạn mã trên làm ví dụ về cách bạn có thể viết nó xuống. Nhiệm vụ bạn đã thực hiện không có một mức tối thiểu cục bộ duy nhất (đó là toàn cầu sau đó), nhưng một số cực tiểu cục bộ. Do đó, sử dụng các bộ giải lồi phi tuyến tính tiêu chuẩn mà JuMP hỗ trợ sẽ chỉ tìm thấy một tối ưu cục bộ (không nhất thiết phải là toàn cầu). Để tìm kiếm tối ưu toàn cầu, bạn cần chuyển sang người giải quyết toàn cầu, ví dụ: https://github.com/robertfeldt/BlackBoxOptim.jl .


Điều này dường như để giải quyết nó, cảm ơn bạn rất nhiều!
grtnh

Mã này hoạt động, nhưng nó chỉ tìm thấy một cực địa phương như đã nhận xét.
Bogumił Kamiński
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.