我有問題(見https://public.jmp.com/packages/Problematic-Nonlinear-Fit/js-p/kz0BFg2_XHtZjz6kNKdXg ) 我正在擬合非線性模型,並且由於數據的原因,模型擬合存在一些不穩定性。當與真實的理論模型相比,數據中存在小的誤差時,非線性模型中的參數之一往往會“滑向無窮大”。我想做的是擬合非線性模型,但對該參數(例如 L2 範數)進行懲罰,以防止參數爆炸。
我的意思是:
假設我的非線性模型是
f(t) = A * (1 - exp(-k*t)) + B * (1-exp(0.0193 * t))
通常,為找到參數估計而最小化的損失函數是平方誤差損失
find(A, k,
使得 sum { (yf(t))^2) } 最小化
我想做的是更像
find(A, k,
使 sum{ (yf(t))^2 + lambda*k^2} 最小化
其中 lambda 是一個正則化參數,我會根據簡單的網格搜索自行選擇。
我研究過使用自定義損失函數列,但我不知道是否可以在該列中包含來自另一列的模型參數。
關於如何防止費率(“k”)爆炸的任何想法?
我嘗試使用數值導數,但這並沒有改變結果。參數界限會按照您的想法進行,只需將估計值設為指定界限即可。
我也在這篇文章中上傳了示例數據。
我確實想到了一種方法來做到這一點,使用預測分析器。這是我的方法:
我創建了一個表(見附件),其中包含 k、A、B、lambda 列和我想要最小化的“損失”函數的列。附表有 2 個損失函數(QuadLoss 和 L2RegLoss)。這些列中的每一列都有一個更複雜的腳本作為公式。我將輪廓數據存儲為矩陣,將 y 和 t 值提取為向量,然後計算 y 與模型之間的差異(完成將模型寫為 t、k、A 和 B 的函數)。然後我計算平方誤差之和加上任何添加的正則化懲罰作為最後一個結果。lambda 的值會縮放懲罰值。我“矢量化”了這個函數,只是為了讓它更容易編寫。這是 QuadLoss 的函數:
dmat = [0.061033 3, 0.0706 6, 0.0923 12, 0.104767 24, 0.122933 48, 0.1657 120, 0.2201 240];
yvec = dmat[0, 1];
tvec = dmat[0, 2];
rvec = yvec - (:A * (1 - Exp( -:k * tvec )) + :B * (1 - Exp( -0.0193 * tvec )));
(rvec` * rvec)[1];
這是 L2RegLoss 的函數
dmat = [0.061033 3, 0.0706 6, 0.0923 12, 0.104767 24, 0.122933 48, 0.1657 120, 0.2201 240];
yvec = dmat[0, 1];
tvec = dmat[0, 2];
rvec = yvec - (:A * (1 - Exp( -:k * tvec )) + :B * (1 - Exp( -0.0193 * tvec )));
(rvec` * rvec)[1] + :lambda * :k ^ 2;
然後,使用 Prediction Profiler 和一個期望函數來最小化損失,我查看了 lambda(正則化調整參數)的不同值對 k 值的影響。在這種情況下,我只是正則化 k,而不是 A 和 B。

“NoReg”保存的設置只是使用二次損失(平方誤差之和),這應該類似於非線性平台正在做的事情(但不完全是,因為在這種情況下,我正在使用分析器中的優化例程,它我很確定與非線性平台使用的不同)。然後我為 lambda 嘗試了 0.01、0.001、0.1 的值,並且 k 的估計值受調整參數值的影響很大。所以我對這種方法並不完全滿意。調整參數的選擇具有挑戰性,不確定這是否是一種合理的方法。
我想了很久這個問題,但我不知道如何顯示當前參數值,以便它們可以用於正則化損失函數。 有可能跳過預測公式並在損失函數中表達整個模型。 據我所知,自定義損失函數是一個弱點。
有一個內置功能可能有助於代替正則化。 看幫助 > JMP 文檔庫 > 預測和專業建模 > 非線性回歸 > 其他示例 > 設置參數限制的示例. 此解決方案的問題在於您的參數可能只是以上限而不是無窮大結束。
您是否嘗試過一些非默認設置來提供幫助? 我懷疑是否僅限數字導數有助於? 會使用二階導數選項幫助?