Làm cách nào để sử dụng chính xác mã Matlab GPML cho một vấn đề thực tế (không phải bản demo)?


9

Tôi đã tải xuống mã GPML Matlab mã GPML gần đây nhất và tôi đã đọc tài liệu và chạy bản thử nghiệm hồi quy mà không gặp vấn đề gì. Tuy nhiên, tôi đang gặp khó khăn trong việc hiểu làm thế nào để áp dụng nó vào một vấn đề hồi quy mà tôi phải đối mặt.

Vấn đề hồi quy được định nghĩa như sau:


Đặt là một vectơ đầu vào và là mục tiêu tương ứng của nó. Tập hợp các đầu vào được sắp xếp thành một ma trận và các mục tiêu tương ứng của chúng được lưu trữ trong một ma trận , với là giá trị đích trung bình trong .xiR20yiR25MX=[x1,,xM]Y=[y1y¯,,yMy¯]y¯Y

Tôi muốn đào tạo một mô hình GPR bằng cách sử dụng hàm số mũ bình phương:G={X,Y,θ}

k(xi,xj)=α2exp(12β2(xixj)2)+γ2δij ,

trong đó bằng nếu và nếu không. Các siêu đường kính là với là mức nhiễu giả định trong dữ liệu huấn luyện và là thang đo chiều dài.δij1i=j0θ=(α,β,γ)γβ

Để đào tạo mô hình, tôi cần giảm thiểu khả năng cận biên của log âm đối với các siêu đường kính:

logp(YX,θ)=12tr(YK1Y)+12logK+c,

Trong đó c là hằng số và ma trận là một hàm của siêu đường kính (xem phương trình k (xi, xj) = ...).K


Dựa trên bản demo được cung cấp trên trang web GPML, nỗ lực của tôi trong việc thực hiện điều này bằng cách sử dụng mã Matlab GPML dưới đây.

covfunc = @covSEiso;
likfunc = @likGauss;
sn = 0.1;
hyp.lik = log(sn);
hyp2.cov = [0;0];
hyp2.lik = log(0.1);
hyp2 = minimize(hyp2, @gp, -100, @infExact, [], covfunc, likfunc, X1, Y1(:, n));
exp(hyp2.lik)
nlml2 = gp(hyp2, @infExact, [], covfunc, likfunc, X1, Y1(:, n));
[m s2] = gp(hyp2, @infExact, [], covfunc, likfunc, X1, Y1(:, n), X2);
Y2r(:, n) = m;

X1 chứa các đầu vào đào tạo

X2 chứa các đầu vào thử nghiệm

Y1 chứa các mục tiêu đào tạo

Y2r là các ước tính từ việc áp dụng mô hình

n là chỉ số được sử dụng để hồi quy từng phần tử trong vectơ đầu ra

Đưa ra vấn đề, đây có phải là cách chính xác để đào tạo và áp dụng mô hình GPR? Nếu không, tôi cần thay đổi điều gì?

Câu trả lời:


7

GP thực hiện công việc tốt cho dữ liệu đào tạo của bạn. Tuy nhiên, nó không tuyệt vời cho dữ liệu thử nghiệm. Có lẽ bạn đã từng chạy một cái gì đó giống như sau:

load('../XYdata_01_01_ab.mat');

for N = 1 : 25
    % normalize
    m = mean(Y1(N,:));
    s = std(Y1(N,:));
    Y1(N,:) = 1/s * (Y1(N,:) - m);
    Y2(N,:) = 1/s * (Y2(N,:) - m);

    covfunc = @covSEiso;
    ell = 2;
    sf = 1;
    hyp.cov = [ log(ell); log(sf)];

    likfunc = @likGauss;
    sn = 1;
    hyp.lik = log(sn);

    hyp = minimize(hyp, @gp, -100, @infExact, [], covfunc, likfunc, X1', Y1(N,:)');
    [m s2] = gp(hyp, @infExact, [], covfunc, likfunc, X1', Y1(N,:)', X1');    
    figure;    
    subplot(2,1,1); hold on;    
    title(['N = ' num2str(N)]);    
    f = [m+2*sqrt(s2); flipdim(m-2*sqrt(s2),1)];
    x = [1:length(m)];
    fill([x'; flipdim(x',1)], f, [7 7 7]/8);
    plot(Y1(N,:)', 'b');
    plot(m, 'r');
    mse_train = mse(Y1(N,:)' - m);

    [m s2] = gp(hyp, @infExact, [], covfunc, likfunc, X1', Y1(N,:)', X2');
    subplot(2,1,2); hold on;
    f = [m+2*sqrt(s2); flipdim(m-2*sqrt(s2),1)];
    x = [1:length(m)];
    fill([x'; flipdim(x',1)], f, [7 7 7]/8);    
    plot(Y2(N,:)', 'b');
    plot(m, 'r');
    mse_test = mse(Y2(N,:)' - m);

    disp(sprintf('N = %d -- train = %5.2f   test = %5.2f', N, mse_train, mse_test));
end

Điều chỉnh siêu đường kính bằng tay và không sử dụng chức năng thu nhỏ có thể cân bằng lỗi tàu và kiểm tra phần nào, nhưng điều chỉnh phương pháp bằng cách xem lỗi kiểm tra không phải là điều bạn phải làm. Tôi nghĩ những gì đang xảy ra là quá nặng đối với ba đối tượng của bạn đã tạo ra dữ liệu đào tạo. Không có phương pháp nào có thể làm tốt công việc ở đây, và làm thế nào được? Bạn cung cấp dữ liệu đào tạo, vì vậy phương pháp cố gắng đạt được càng tốt càng tốt trên dữ liệu đào tạo mà không cần quá nhiều. Và thực tế, nó không quá phù hợp theo nghĩa cổ điển. Nó không phù hợp với dữ liệu, nhưng nó phù hợp với ba đối tượng đào tạo. Ví dụ, xác nhận chéo với tập huấn luyện sẽ cho chúng ta biết rằng không có quá mức. Tuy nhiên, bộ kiểm tra của bạn sẽ được giải thích kém.

Những gì bạn có thể làm là:

  1. Nhận dữ liệu từ nhiều đối tượng để đào tạo. Bằng cách này, người thứ tư của bạn sẽ ít có khả năng trông giống như một "ngoại lệ" như hiện tại. Ngoài ra, bạn chỉ có một chuỗi của mỗi người, phải không? Có lẽ nó sẽ giúp ghi lại trình tự nhiều lần.

  2. Bằng cách nào đó kết hợp kiến ​​thức trước về nhiệm vụ của bạn sẽ giữ cho một phương pháp không bị quá tải đến các đối tượng cụ thể. Trong một GP có thể được thực hiện thông qua chức năng hiệp phương sai, nhưng có lẽ không dễ thực hiện ...

  3. Nếu tôi không nhầm, các chuỗi trong thực tế là chuỗi thời gian. Có lẽ sẽ có ý nghĩa khi khai thác các mối quan hệ tạm thời, ví dụ sử dụng các mạng thần kinh tái phát.

Chắc chắn là nhiều hơn thế, nhưng đó là những điều tôi có thể nghĩ ra ngay bây giờ.


Tôi giả sử một quá trình Gaussian không có nghĩa. Vì các mục tiêu không có nghĩa là 0 nên tôi tập trung chúng bằng cách trừ đi giá trị trung bình của chúng. Bạn nói đúng về sự dư thừa; Tôi đã loại bỏ hai dòng đó. Tôi không tin rằng hàm hiệp phương sai là chính xác khi đưa ra vấn đề và tôi không tự tin về sự thâm nhập của các siêu đường kính. Nghi ngờ của tôi đến từ kết quả. Phần dư thực tế giống như phần dư cho hồi quy sườn và dữ liệu của tôi được biết là rất phi tuyến.
Josh

Bạn nói đúng về chất nền; Nó không nên làm tổn thương trong mọi trường hợp. Tôi thường thêm nó vào hàm hiệp phương sai, như covfunc = { 'covSum', { 'covSEiso' } }tôi không thấy việc này xử lý dữ liệu ồn như thế nào bây giờ, có vẻ như hộp công cụ đã thay đổi khá nhiều kể từ lần cuối tôi sử dụng nó, sẽ xem xét kỹ hơn về sau .
ahans

Bạn biết gì về vấn đề của mình khiến bạn nghĩ rằng covSEiso không phải là một lựa chọn hợp lý? Và hồi quy sườn bạn sử dụng, đó là một kernlized một hoặc tuyến tính? Nếu bạn sử dụng hạt nhân, không có gì đáng ngạc nhiên khi bạn nhận được kết quả tương tự.
ahans

Bạn có thể cung cấp dữ liệu mẫu của vấn đề của bạn? Điều đó sẽ làm mọi thứ dễ dàng hơn một chút, có lẽ chỉ với một chiều mục tiêu.
ahans

1
@Masood Bạn nói đúng, nhưng khi phân phối t Student rất gần với phân phối gaussian. Ngay cả với n> 20, chúng ta thường có một xấp xỉ tốt. n>30
chl

3

Tôi nghĩ rằng vấn đề có thể là một trong những đặc điểm kỹ thuật sai. Nếu mục tiêu của bạn là các góc được bao bọc đến + -180 độ, thì "quá trình nhiễu" cho dữ liệu của bạn có thể không đủ Guassian rằng bằng chứng Baysian không phải là một cách tốt để tối ưu hóa các tham số siêu. Ví dụ, hãy xem xét những gì xảy ra khi "nhiễu" làm cho tín hiệu bị bao quanh. Trong trường hợp đó, có thể là khôn ngoan khi thực hiện lựa chọn mô hình bằng cách giảm thiểu lỗi xác thực chéo (có một triển khai miền công cộng của phương pháp đơn giản Nelder-Mead ở đâynếu bạn không có hộp công cụ tối ưu hóa). Ước tính xác thực chéo của hiệu suất không quá nhạy cảm với đặc tả sai của mô hình vì nó là ước tính trực tiếp của hiệu suất thử nghiệm, trong khi đó khả năng cận biên của mô hình là bằng chứng của mô hình cho rằng các giả định mô hình là chính xác. Xem cuộc thảo luận bắt đầu từ trang 123 của cuốn sách của Rasmussen và Williams.

Một cách tiếp cận khác là mã hóa lại các đầu ra để mô hình nhiễu Gaussian phù hợp hơn. Một điều bạn có thể làm là một số hình thức giảm kích thước không giám sát, vì có các mối quan hệ phi tuyến tính giữa các mục tiêu của bạn (vì chỉ có một cách hạn chế trong đó cơ thể có thể di chuyển), do đó sẽ có một đa chiều thấp hơn mà bạn các mục tiêu tiếp tục tồn tại và sẽ tốt hơn nếu hồi quy các tọa độ của đa tạp đó hơn là các góc (có thể có ít mục tiêu theo cách đó).

Ngoài ra một số loại phân tích Procrustes có thể là một ý tưởng tốt để bình thường hóa sự khác biệt giữa các đối tượng trước khi đào tạo mô hình.

Bạn có thể tìm thấy một số công việc được thực hiện bởi Neil Lawrence trong việc phục hồi sở thích của con người. Tôi nhớ đã thấy một bản demo của điều này tại một hội nghị vài năm trước và rất ấn tượng.


Từ phân tích của tôi, tôi đã nhận thấy rằng sự không liên tục trong không gian đầu ra gây ra một số vấn đề. Tôi đã cân nhắc sử dụng các vị trí khớp thay vì góc khớp để khắc phục vấn đề này. Bằng cách giảm kích thước, bạn đã có một phương pháp cụ thể trong tâm trí? Không giống như các cách tiếp cận dựa trên hình ảnh, tôi không thấy sự khác biệt trong các đối tượng (ngoài các kiểu chuyển động của chúng) sẽ ảnh hưởng đến việc đào tạo mô hình như thế nào, do tôi đang sử dụng các định hướng của cảm biến IMU được đặt và xử lý hậu kỳ căn chỉnh giữa các môn học.
Josh

Tôi đã đi qua giấy của Lawrence trước đây. Vì chỉ có 1 trình tự được đề cập trong bài báo, có vẻ như một số dạng CV gấp k được thực hiện. Trong trường hợp đó, vấn đề trở nên gần như không đáng kể. Ánh xạ cùng chủ đề của một hoạt động, cụ thể là theo chu kỳ, thường đơn giản để có được ước tính tư thế đàng hoàng. Tôi đã so sánh các ánh xạ cùng chủ đề và liên chủ đề, và sự khác biệt là rất đáng kể. Thật không may, nghiên cứu trong lĩnh vực này về cơ bản là không thể so sánh được do mọi người sử dụng khung hồi quy riêng, dữ liệu mocap, số liệu lỗi và cấu trúc đầu vào / đầu ra.
Josh
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.