🚀 從零開始:打造基於 Morris Method 的參數敏感度分析工具
- abintsai
- 2025年12月12日
- 讀畢需時 4 分鐘

在工程模擬和科學研究中,我們經常面對數十甚至數百個輸入參數。如何快速且有效地判斷「哪個參數對結果影響最大」?這就是敏感度分析 (Sensitivity Analysis, SA) 的核心問題。
本文將聚焦於一種高效且計算成本相對較低的 SA 方法——Morris Method (莫里斯法),並展示如何使用 Python Streamlit 框架,快速搭建一個集成了參數生成與數據預處理的網頁工具。
一、 Morris Method 簡介:為何選擇它?
Morris Method 是一種全域、定性的敏感度分析方法。
核心優勢
計算效率高: 相較於 Monte Carlo 或 Sobol' 這種需要上萬次模擬的定量方法,Morris Method 所需的模擬次數通常僅為 r*(k+1) 次(r 為路徑數,k 為參數個數),計算成本大大降低。
定性判斷: 能夠快速區分「影響力微弱」和「影響力顯著」的參數。
可識別非線性: 它不僅能評估參數的單獨影響,還能初步識別參數間的交互作用 (Interaction) 或非線性 (Non-linearity) 效應。
數學核心:Elementary Effects (EE)
Morris Method 通過計算參數的基本效應 (Elementary Effects, EE) 來衡量敏感度 。
EE 的核心思想是:在參數空間中隨機選取一個起點,然後只改變其中一個參數的值(移動一小步 Δ),觀察模型輸出的變化量。

二、 關鍵參數 p 與 r 的設定
Morris Method 的品質高度依賴兩個核心參數:Grid Levels (p) 和 Trajectories (r)。

💡 總實驗次數 = r*(k+1),其中 k 是參數個數。這個數值是控制模擬成本的關鍵。
三、 Streamlit 實戰:生成器介面開發
我們使用 Python 的 Streamlit 和 SALib 庫,實現了一個左右分欄的網頁工具。
左側: 負責輸入參數定義、設定 p 和 r。
右側: 負責預覽生成的參數矩陣,並提供 CSV 下載。
1. 技術選型
Python: 程式語言核心。
Streamlit: 快速建立互動式網頁應用程式 (Web App),無須 HTML/CSS 基礎。
SALib: 專門的敏感度分析庫,內建 Morris 採樣算法。
Pandas: 處理數據表格和 CSV 輸出。
2. 核心程式碼片段 (morris_app.py)
以下是實現參數生成器的核心邏輯:(完整程式碼)
=================================================================
import streamlit as st import pandas as pd from SALib.sample import morris import io # 設定網頁標題與佈局 (Wide mode 讓左右欄位更寬敞) st.set_page_config(page_title="Morris Method Generator", layout="wide") st.title("Morris Method 參數矩陣生成器") st.markdown("---") # 建立左右兩欄 (比例可以調整,這裡設為 1:1.5) left_col, right_col = st.columns([1, 1.5]) # --- 左側:輸入設定區 --- with left_col: st.header("1. 參數與演算法設定") # 1.1 Morris 演算法參數 st.subheader("演算法參數 (Algorithm)") with st.expander("什麼是 Trajectories 和 Grid Levels?", expanded=False): st.info(""" - **Trajectories (r):** 路徑數。決定要在空間中進行幾次獨立的隨機行走。數值越大,覆蓋率越好,但實驗次數越多。建議 10~50。 - **Grid Levels (p):** 解析度。將參數範圍切分成幾等份。數值越大,解析度越高。通常設為 4 或 8。 """) col_p, col_r = st.columns(2) p = col_p.number_input("Grid Levels (p)", min_value=2, value=4, step=2, help="解析度,建議為偶數") r = col_r.number_input("Trajectories (r)", min_value=1, value=10, step=1, help="路徑數,影響總實驗次數") # 1.2 參數定義 (使用 Data Editor 讓使用者像 Excel 一樣輸入) st.subheader("參數定義 (Parameters)") st.markdown("請在下方表格直接編輯參數名稱與上下限:") # 預設資料 default_data = pd.DataFrame([ {"Name": "Param_A", "Min": 0.0, "Max": 100.0}, {"Name": "Param_B", "Min": 0.5, "Max": 1.5}, {"Name": "Param_C", "Min": 10.0, "Max": 20.0}, ]) # 可編輯的表格 (允許新增/刪除行) edited_df = st.data_editor(default_data, num_rows="dynamic", use_container_width=True) # 計算預計實驗次數 num_params = len(edited_df) total_runs = r * (num_params + 1) st.success(f"📊 參數數量: {num_params} | 預計產生樣本數: **{total_runs}** 筆") # 生成按鈕 generate_btn = st.button("生成參數矩陣 (Generate Matrix)", type="primary", use_container_width=True) # --- 右側:輸出與預覽區 --- with right_col: st.header("2. 矩陣預覽與下載") if generate_btn: # 檢查參數完整性 if edited_df.isnull().values.any() or edited_df['Name'].str.strip().eq("").any(): st.error("請確保所有參數名稱與數值皆已填寫完整。") else: # 準備 SALib 需要的 Problem Dictionary problem = { 'num_vars': num_params, 'names': edited_df['Name'].tolist(), 'bounds': edited_df[['Min', 'Max']].values.tolist() } try: # 執行 Morris 採樣 param_values = morris.sample(problem, N=r, num_levels=p) # 轉成 DataFrame 方便顯示與下載 # 加上 Run_ID 讓後續分析可以對應 result_df = pd.DataFrame(param_values, columns=problem['names']) result_df.insert(0, 'Run_ID', range(1, len(result_df) + 1)) # 顯示預覽 (只顯示前 20 筆以免網頁太長) st.dataframe(result_df, height=400, use_container_width=True) # CSV 下載按鈕 csv = result_df.to_csv(index=False).encode('utf-8') st.download_button( label=f"📥 下載 CSV 文件 ({total_runs} rows)", data=csv, file_name='morris_params_matrix.csv', mime='text/csv', type="primary" ) # 簡單的統計圖表 (讓畫面不空虛) st.caption("參數空間分佈預覽 (前兩個參數):") if num_params >= 2: st.scatter_chart(result_df, x=result_df.columns[1], y=result_df.columns[2]) except Exception as e: st.error(f"生成過程發生錯誤: {e}") else: st.info("👈 請在左側設定參數後,點擊「生成參數矩陣」按鈕。")
=================================================================
四、 未來擴展:結果分析與圖表視覺化
完成參數矩陣生成後,下一步就是執行模擬,並將結果回傳給工具進行分析。
1. 核心指標
在下一階段,我們將計算和繪製 Morris Method 的兩大指標 :
Mean of Absolute Elementary Effects (μ*): 參數的平均影響力(絕對值),用於判斷參數的重要性排序。
Standard Deviation σ): 基本效應的標準差,用於判斷參數的非線性或交互作用程度。
2. 分析圖表(Morris Plot)
最關鍵的圖表是μ* vs $\sigma$ 散佈圖:
位於圖表右側(高 μ*): 參數影響力強。
位於圖表上側(高 σ): 參數具有顯著的非線性或與其他參數有強烈的交互作用。
位於左下側: 參數影響力微弱,可忽略。
結論
透過 Streamlit 和 Morris Method,我們快速建立了一個實用且低成本的敏感度分析前置工具。它不僅簡化了實驗設計流程,也為後續的結果分析與視覺化奠定了堅實的數據基礎。
接下來,只需要擴展右側欄位,加入結果上傳與 SALib.analyze.morris 的邏輯,即可完成整個敏感度分析的閉環。
操作畫面
(這是一個銅鋁合金雷射焊接的參數測試, 希望找出在功率, 對焦位置, rsize 以及雷射移動速度中, 對金屬混合比例的影響)




留言