非線性方程組的最小平方法迴歸你好 - 我有一個中等複雜的物理過程模型(離子吸附對於任何知道這意味著什麼的人來說)。 我有兩個起始變數 x1 和 x2,以及兩個隨 x1 和 x2 變化的測量結果 y1 和 y2,以及不可測量或難以測量的變數 g1,...,gn 不會改變。 對於系列中的每一行,x1 和 x2 中的一個或兩個也可以更改。 我有一組非線性方程式 s = f(x1, x2, y1,...,y2, g1,...,gn),以及 f 中不同變數的一些其他函數,取決於我的複雜程度想要的模型是。 請參閱附件中的範例方程式。
我們執行此操作的典型方法是在 Matlab 中使用 lsqnonlin。 效果很好,但是跑起來很麻煩。 我寧願有一個(不那麼簡單)列公式。 但是,我不完全確定如何編碼。 非線性迴歸是為單一方程式建構的,三個方程式都描述相同的 s,看起來遞歸會很多。 我也不確定損失函數是什麼。 在matlab中,我們輸入猜測值,計算猜測值和計算值之間的最小二乘,如果所有猜測值和方程式的平方差總和超出某個公差,則更新它,然後循環。 我假設這是由非線性平台內部完成的,但是我的目標是否為零,因為我希望平方差總和為零? 或者如果沒有,我該如何做多個方程式?
如果這比我想像的簡單得多,我深表歉意。
進階統計建模視窗回覆:非線性方程組的最小平方法迴歸我建議的一種方法是定義適當的丟失函數的舊技巧。 在您的情況下,丟失的功能可能是:
(s-f1(...))^2 + (s-f2(...))^2 + (s-f3(...))^2 + ...
每個元素都是系統中方程式的平方誤差。 您對它們進行總結,並將總體誤差最小化。 此方法將非線性最小平方法問題轉換為損失函數最佳化問題。
同時,我認為對方程組使用非線性最小平方法仍然是可行的。 步驟如下:
- 擴展您的數據表。 對於每一行,您都會複製它,副本的總數與系統中方程式的數量相同。 這加入可能對這項任務有用。 您需要建立一個 Freq 列,其單元格值為方程式的數量。
- 現在您需要建立那個不那麼簡單的公式列。 根據上一步中行的排列方式,您可能需要以不同的方式編寫公式。 但目標如下。 對於原始行的每個副本,將其分配給系統中的一個方程式。 因此,最終,行的每個副本都與系統中的不同方程式相關聯。 您可能需要弄清楚如何將行號與方程號關聯起來。 如果副本位於連續行中,如上述加載項的結果,您可能需要「Modulo」函數來進行對應。
最後,使用您所知道的非線性來解決最小二乘問題。
回覆:非線性方程組的最小平方法迴歸我有一些程式碼用來模擬水分吸附過程 - 它尋求多個物理模型所描述的平衡條件 - 我將看看是否可以製作一個可以在此處分享的程式碼的通用版本。
回覆:非線性方程組的最小平方法迴歸你好@peng_liu感謝您的答复,並對延遲回复表示歉意! 論文+兩個月大的寶寶讓你忘記跟進事情。
您會選擇什麼作為 s? 我沒有測量任何s,在matlab程式碼中,我們猜測一個s,然後更新。 您建議如何這樣做?
至於最小平方法,看起來很有趣。 您是否有為另一個項目製作的表格,我可以看看它可以做類似的事情? 對於我所有的腳本編寫,我沒有對基於行的公式做太多事情,而且當我這樣做時,我也失敗了。
回覆:非線性方程組的最小平方法迴歸你好@大衛_伯納姆- 是的,如果你有一個通用版本,那將非常有幫助。回覆:非線性方程組的最小平方法迴歸恭喜!
所以,“s”在這裡是一個未知參數。 在這種情況下,將所有方程式改寫為:0 = f(...) - s。
或者,如果方程式中的量已知,請將它們移到左側。 當您使用非線性平台時,左側將是您的 Y。
我沒有例子,所以我編了一個。 附:eqns.jmp的廢話系統
它有
- Y 列,已知數量。
- 公式列,右邊的內容是方程式的大小
- 標籤列表示奇數行對應第一個方程,偶數行對應第二個方程
- 作為右側方程式一部分的其他已知量。
請參閱「公式」列中的公式,以了解如何在單一列中指派兩個方程式。
回覆:非線性方程組的最小平方法迴歸感謝您的指導@peng_liu !
我已經整理了一個表,如果我有幾行,它似乎可以工作,但如果我嘗試做更多的事情,它會給我這個:

這確實是行數太多的問題嗎? 如果我將行數減少到最少(本例中為 3 行),並且我必須建立一個新表,則該錯誤似乎仍然存在。 您對此有什麼想法嗎? 這是我用模型的準系統版本製作的表格,因此並不麻煩。 我還將參數放入自己的列中(Phi0、sigma0、pHf)並擴展了中間公式,以便更輕鬆地查看列公式。
回覆:非線性方程組的最小平方法迴歸我不確定如何使用此數據表運行非線性平台。 哪個是Y,哪個是X?
但如果“公式”列是X,我認為它不會起作用。 X的公式必須使用參數,而不是表格變數。
下面是那個「廢話資料表」中X列的樣子。

您的“公式”列在參數下沒有列出任何內容。
回覆:非線性方程組的最小平方法迴歸嘿@peng_liu - 是的,因為參數使公式長了 100 倍,所以我將它們轉儲到 Phi0、sigma0 和 pHf 列中(標題為“.”的列後的第 6-8 列),然後選擇非線性平台底部的“展開中間公式”框。 這樣我就可以使用參數,但它們不會使公式列無法使用,因為每個參數都有許多「擴展類別」。
那有意義嗎?
所附的螢幕截圖應顯示這些列及其在公式中的位置,以便更清楚地顯示。
回覆:非線性方程組的最小平方法迴歸@peng_liu我還要說的是,我發現 1)僅數值導數選項似乎確實可以讓它進入主平台,2)當我在多個方程中具有參數時,似乎給出了錯誤。 不確定這是否告訴你什麼。 我只是找不到該錯誤的參考,所以我很困惑。
回覆:非線性方程組的最小平方法迴歸謝謝你的解釋, @ehchandler我明白你現在在做什麼。 對於如此複雜的問題,你正在做的事情是一個很好的技巧。 對我來說有些新東西!
我查看了錯誤訊息。 您需要選取“僅數值導數”。

您有 300 多個參數,底層符號導數已達極限。
我看到你有 337 行,但有 339 個參數。 這個子集不會得到解決方案。 希望您的全套沒有問題。
同時,當我查看你的設定時,發現了一些有趣的事情。 我不知道你的主題。 但在您的設定中,Phi0、sigma0 和 pHf 是 pH0 的離散函數。 三者與pH0之間的關係已知嗎? 如果其中已知連續關係(具有較少的未知參數),則可能會大大減少參數的數量。
回覆:非線性方程組的最小平方法迴歸@peng_liu好吧,這更有意義。 您是否知道符號導數程式碼中項或參數數量的限制? 因為我想我可以只擁有一個包含幾個數字的列,然後使用“by”功能對計算進行分段。 符號導數的速度快得多。
嗯。 不確定新參數從哪裡來。 我進去後會檢查一下。 感謝您注意到這一點。 三個相關問題:1)您是如何看到參數數量的?2)在列公式選單中是否可以批次刪除參數? 據我所知,你必須右鍵單擊,單擊刪除一項一項。 3)有沒有辦法使用表格來輸入參數及其界限? 這確實有助於加快速度。
謝謝!
回覆:非線性方程組的最小平方法迴歸限制不在於參數數量。 但參數的數量是你的情況的一個因素。 所以,你必須嘗試看看。
我看到您的系統有三種不同類型的參數:Phi、sigma、pHf。 它們都以 pH0 值為條件。 因此,不同pH0下的參數是獨立的。 所以,你是對的,做「By」擬合可以降低複雜性。
PS「By」沒有照我的意願工作。 所有行都可以看到列中的所有參數。 我不認為可以讓 By 中的各個行只查看參數的子集。
啟動非線性後我看到了參數的數量。 有一個參數的能力。 我右鍵單擊並從中創建一個表,計算行數。 最後兩行,我建議只編輯 JSL 公式。 打開列的公式編輯器。 複製它,然後貼上到 JSL 編輯器中。 編輯完成後,複製並貼上回來。 透過這樣,您可以編輯參數清單:
“1”部分是您的參數清單。 “2”是實際的公式。

回覆:非線性方程組的最小平方法迴歸跟進如何使用“By”。
似乎有一種方法可以使用 By 並減少參數數量以利用行之間的獨立性。
我附上「廢話系統」的v2。 首先解釋一下我設定的內容。

我建立了兩個線性方程組。 第 1 行和第 2 行是系統“a”,即群組列。 第 3 行和第 4 行是系統「b」。
每個線性系統都有兩個參數“b0”和“b1”,但它們在系統之間是不同的。 我使用參數 x1 和 x2 來產生“SimY”。 我將 SimY 複製到 Y 進行分析。
現在看看“公式”列,我不按組區分“b0”和“b1”。

現在使用 By = Group 運行非線性。 這是報告:

它為各個系統找到單獨、正確的解決方案。
回覆:非線性方程組的最小平方法迴歸@peng_liu是的,我也遇到了問題。 你的解決方案看起來不錯! 但是,當我嘗試將其應用到我的表時,它出錯了。 您在附表中看到一個明顯的問題嗎? Phi0、sigma0 和 pHf 與以前相同。 但是,我為您提到的“按”方法建立了“循環分類”列,但隨後有一個“按列參數”。 我使用此列的層級來按類別擴展參數。 由於:Cyclic Categorization 和:Parameter by columns 是正交的(或無論正確的詞是什麼),這應該允許參數以微小的偏移量迭代整個曲線(pH0 是x 軸),然後我可以將它們放在一起再次在最後。 然而,就像我說的,它失敗了並且只更新了參數的一個級別,並且不知道為什麼。
這可能是 by 如何與按類別擴展的參數互動的問題嗎?
回覆:非線性方程組的最小平方法迴歸Column3 中缺少值,這解釋了為什麼只有一組有結果。 但「公式」並沒有按照我推薦的那樣設定。 我附上 test.v2 來說明。 透過這種方法,您不再需要中間的 Phi0、sigma0 和 pHf。
回覆:非線性方程組的最小平方法迴歸@peng_liu哦,呃。 不知道我是如何錯過那麼多缺失的行的。 感謝您注意到這一點。
所以也許我誤解了,但由於 pH0 是我的 x 軸,你的解決方案是否意味著 by 列是 x 列?就像如果你有 100 個值,那麼你就有 100 個「組」?
如果是這樣,那麼按列擴展版本不是更好嗎,因為您正在最小化多個點上的錯誤,而不是只是每個點的自包含最小化? 或者逐點處理損失函數是更好的方法? 我只是將我必須的 matlab 程式碼擬合到 JMP,但並沒有最小化演算法方面的專業知識,所以無論最好的技術是什麼,我都會支持。
聚苯乙烯 也許我沒有說清楚,但每個 pH0 值(即因變數)的每個參數都應該有一組唯一的值。 這就是為什麼我認為我需要按類別進行擴展。
謝謝!
回覆:非線性方程組的最小平方法迴歸我看到原始表中的“公式”列取決於 pH0。 但 test.jmp 中的「公式」列不依賴 pH0。 我想這是我們之間的誤會。 讓我仍然使用你的原始數據,所以 Phi0、sigma0、pHf 取決於 pH0,而不是「按列的參數」。
我們來看前三行:

它們的 pH0 = 0.2。 因此,第一行的公式可以表示為:
f1(Phi0_pH0_0.2,sigma0_pH0_0.2,pHf0_pH0_0.2)。
第二行和第三行公式為:
f2(Phi0_pH0_0.2、sigma0_pH0_0.2、pHf0_pH0_0.2) 和
f3(Phi0_pH0_0.2,sigma0_pH0_0.2,pHf0_pH0_0.2)。 這三行構成第 1 組。
現在看第 4、5、6 行。 它們的 pH0 = 0.3。 所以這三個公式是:
f1(Phi0_pH0_0.3, sigma0_pH0_0.3, pHf0_pH0_0.3),
f2(Phi0_pH0_0.3、sigma0_pH0_0.3、pHf0_pH0_0.3),以及
f3(Phi0_pH0_0.3,sigma0_pH0_0.3,pHf0_pH0_0.3)。 這三行構成第 2 組。
Group1 和 Group2 不共用同一組參數。 他們是獨立的。 最小化 Group1 的錯誤與最小化 Group2 的錯誤無關。 所以,我們可以逐組優化。
如果將三個中間欄位中的參數設為 Phi0_pH0_0.2、Phi0_pH0_0.3、Phi0_pH0_0.4 等,則每一行都會看到所有這些參數。 您可以看到,如果您按 pH0 運行非線性,則每組都會列出數百個參數。 但其中,每行只有三個相關,並且每三行相關。
我所做的只是在“公式”列內創建三個參數。 我將它們命名為 paramPhi0、paramSigma0、parampHf。 即使只有三個,當我們透過「pH0」運行非線性時,平台也會透過「pH0」創建不同的三個參數集。 它實際上是透過“pH0”為您創建了數百個參數。 pH0 的每個小非線性只需要擔心三個參數。