這是關於如何將分段連續函數擬合到數據集的系列文章中的第三篇。 我將在每篇文章的開頭提供指向該系列所有其他文章的鏈接。 他們是:
進入第 3 部分...
介紹
如果您已經閱讀了本系列中我之前的帖子,您就會知道我們現在已經開發了包含 10 個未知參數的方程,這些參數需要確定以最好地擬合示例問題的各個部分。 我們如何做到這一點JMP ?
首先,我們需要使用 JMP 的公式編輯器來輸入我們的方程和未知參數。 我假設讀者通常熟悉公式編輯器。 (如果沒有,這裡有一個關於創建公式的短視頻和一個更長的視頻,在公式編輯器上有更多的細節.)
在 JMP 的公式編輯器中設置參數
您可能不知道的是公式編輯器中設置參數的能力。 參數是您正在創建的公式的局部變量。 它們是通過下拉菜單訪問的(默認是表變量,切換到參數,如圖 1 所示。)
圖 1:在公式編輯器中訪問參數
這將提供一個選項,用於向公式添加“新參數”。 讓我們做一個簡單的例子,並在參數列表中添加一個名為“a0”的參數。 單擊 New Parameter,然後將參數名稱更改為“a0”,並將其值為 1:
圖 2:創建一個新參數並為其賦予初始值
- “名稱”是任意的。 您可以選擇任何有效的 JSL 變量名稱。
- “值”是該參數的起始值。 你必須給出一個起始值。 有時(取決於您選擇的公式),起始值可能很重要,並且應該選擇接近您可以猜測的真實值。 (這有助於防止以後出現收斂問題。)在這種情況下,我不知道該值應該是多少,因此我將隨意選擇一個起始值 1。
現在我們可以在公式中使用這個新的“a0”參數,就像它是一個列變量一樣。 讓我們簡單地將它添加到標記為“y”的列中的值。 雙擊參數列表中的 a0(它應該出現在公式面板中),然後鍵入“+”,然後雙擊列列表中的“y”。 這應該給出以下公式:
圖 3:在公式中使用參數
現在當我們點擊 OK 並查看數據表中的結果時,我們有
圖 4:在公式中使用參數的結果
因此,公式現在識別 a0 參數的當前值並相應地應用它。 當我們使用 JMP 非線性平台求解未知參數時,將在下一篇博文中使用這個重要概念。
為分段函數輸入參數
在本博客系列的第 2 部分中,我們開發了五個簡單的多項式,以應用於示例數據系列中的斷點之間。 這些多項式有六個未知參數: a0、b1、b2、c1、d1 和 d2。 我們還有四個分割點定義了多項式處於活動狀態的區域:X1、X2、X3 和 X4。 我們需要將這些參數中的每一個添加到我們的公式參數列表中,以及合理的起始值。 完成後,參數列表如下所示:
圖 5:為我們的分段示例輸入和初始化的所有十個參數
請注意,我假設多項式中的每個係數的起始值為“1”。 對於斷點 X1 到 X4,我選擇基於我認為它們可能出現的“眼球”來估計值。 這只是為 JMP 提供了一個更好的起點來開始尋找斷點。
輸入分段公式 - 包括布爾技巧!
現在您知道如何在公式編輯器中設置參數,並且您也知道如何將第 2 部分中顯示的五個分段方程中的任何一個輸入到公式編輯器中。 但是我們如何將所有五個分段方程輸入到同一個公式中?
一種方法是使用大的 IF 語句,例如“如果 x@PatrickGiuliano ,他在之前的 JMP 社區討論主題中發布了一個有用的技巧。
JMP 識別布爾運算符(And、Or、Nor 等)。 如果在公式中使用布爾運算符,則布爾邏輯在為真時返回 1,如果為假則返回 0。 所以我們可以設置一個運算符,例如 (X1<:x & :x<=X2)。 如果“x”列中的值(在表達式中稱為“:x”)在參數 X1 和 X2 之間,則此運算符返回 1,否則返回 0。 所以我們可以簡單地將 X1-X2 段的分段方程乘以上述布爾表達式。 如果 x 的值在適當的範圍內,則激活分段方程。 如果不是,我們返回 0。 然後我們將對所有其他範圍做同樣的事情,並將所有方程相加。
如果我們完成所有這些,我們最終會得到一個如下所示的公式:
圖 6:完整的分段公式(在公式編輯器模式下顯示)
以下是 JSL 輸入格式的相同信息,如果您願意:
圖 7:完整的分段公式(以 JSL 模式顯示)
總而言之,在圖 6 和圖 7 中,我們基本上在一個新列(稱為 ypred)中構建了一個公式:
- 定義將在公式中使用的 10 個未知參數(並給每個參數一個適當的起始值)。
- 描述四個分段方程,每個方程都使用其適當的參數。
- 通過乘以描述每個方程範圍的適當布爾不等式激活每個分段方程。
- 將四個方程相加得到最終公式。
很酷...
系列中的下一個
下一次,我們將最終使用非線性平台的方程來求解最佳擬合參數。 我們還將討論收斂標準和算法的選擇。
你好@JerryFish ,到目前為止,我真的很喜歡這些博客文章!對於不是每天都在做參數優化的人,很高興有這個資源可以回顧一下,以便重新了解如何做,以及如何處理更高級的案例,比如這裡介紹的分段非線性擬合。
與這篇文章相關的快速問題:如果我想生成在“時間”內產生逐漸增加(或減少)趨勢的模擬數據(為簡單起見,我們可以使用行順序)我如何在 JMP 中對其進行參數化? (或者有沒有更簡單的方法不使用模型參數化,例如結合即時列公式?)。
謝謝!@PatrickGiuliano