2014-05-11 31 views
0

我想了解迴歸如何以八度爲單位實現它。要檢查我的功能是否正確,我將其結果與內置函數polyfit進行比較。這裏是我的代碼:八度中的多項式迴歸 - 係數太小

p = [0, 1.5 * pi]; 

    function y = f(x) 
     y = (exp(-4 * sin(4*x))); 
    end 

    function c = regress1(x, y, degree) 
     L = @(j)(arrayfun(@(k)(j^k), (0:degree))); 

     x_data = []; 
     for i = x 
      x_data = [x_data; L(i)]; 
     end 

     mx = x_data; 
     my = y'; 

     c = fliplr((pinv(mx' * mx) * mx' * my)'); 
    end 

    % number of known points 
    N = 50; 
    % polynomial degree 
    D = 20; 

    % known points 
    X = linspace(p(1), p(2), N); 
    Y = arrayfun(@f, X); 

    % my function 
    R = regress1(X, Y, D); 
    % reference function 
    C = polyfit(X, Y, D); 

    % test points 
    W = linspace(p(1), p(2), 1000); 
    V1 = arrayfun(@(x)(polyval(R,x)), W); 
    Z = arrayfun(@(x)(polyval(C,x)), W); 


    clf; 
    hold on; 
    fplot(@f, p); 
    plot(X, Y, '*'); 
    plot(W, V1, '1-'); 
    plot(W, Z, '2-'); 
    hold off; 

的問題是,它適用於小的程度(在我的程序變量D),但更大程度它producecs太小系數。原單功能和兩個近似的情節: - 藍色的,我 - 紅,polyfit - 原單綠色

我懷疑的東西在這部分(pinv(mx' * mx) * mx' * my)'可能是錯誤的。另外,如果我從pinv更改爲inv,我會得到不同的結果,但更糟。

我做了一些研究,發現了一些其他解決方案,例如,但即使這些程序相似,我也找不到我的錯誤。

請問有人能解釋我有什麼不對嗎?

回答

1

對於大D(近似多項式的階數),您的矩陣變爲病態。您可以嘗試使用不同種類的多項式基礎來進行迴歸。對於例如使用切比雪夫多項式而不是x,x^2,x^3,...,x^D。

如果您居中並縮放數據,則可以獲得稍好的結果。基本上,如果你試圖以適應功能的一組(X,Y),則可以使用重新定義問題:

XN =(X - 均值(X))/ STD(x)的

是配合後(xn,y)上的集合。

+0

將解決它而不反轉矩陣的幫助?我的意思是如果我使用其他方法解決方程系統。 – GSPdibbler

+0

不是。你已經避免使用與「pinv」相反的內容。 – mmisu