DistFit(dsh-easydistfit):把數值表變成分佈擬合報告的 DSH 插件

前言

DSH 的理念是「一切皆插件」,數據分析類的活兒也可以做成面板,而不是隻能在對話裏來回貼結果。做科研時常見的路徑是:把數據從 Excel 粘進 Python,用 scipy.stats 把候選分佈一個個試一遍,再手動畫直方圖、調字體、改配色、按期刊欄寬出圖。擬合、檢驗、排名、出圖是四件事,卻因爲每換一個數據集就要重走一遍,最後花在調圖上的時間往往比算的時間還多。

DistFit 把這條鏈路收進一個 GUI 左側欄的獨立面板。維護者是 stormx-u,倉庫名 dsh-easydistfit(GitHub 上的項目名是 dsh-easydistfit,package.json 裏的 name 是 dsh-distfit),MIT 協議,分類屬於模型推理工具。它將 23 個分佈族的擬合、K-S/A-D/CvM/χ² 四類擬合優度檢驗、AIC 排名、AI 解讀和論文/PPT 模板出圖串成一個流程,統計部分是純 JavaScript 實現,不依賴 Python 和 SciPy。安裝後除了面板,還註冊了 distfit_fit 工具,對話裏的助手可以直接調用。

安裝與啓用

先從本倉庫安裝,把 <本倉庫路徑> 換成 clone 下來的目錄:

dsh plugin --profile web add link:"<本倉庫路徑>"

也可以在 GUI 的「插件」頁裏安裝本地目錄或倉庫目錄。安裝後左側欄出現「分佈擬合」圖標,點開即用。客戶端改動刷新頁面即可,Host 半邊(工具、AI 路由)改動需要重啓一次 DSH。

運行要求寫在兩處:README 裏是 DSH >= 0.1.7-rc.1;package.json 的 dsh.engines.dsh 是 >=0.1.0。構建和測試需要 Node.js 24+。當前 package.json 中的版本是 0.6.0。

數據與擬合

支持兩種輸入:粘貼 CSV / TSV(首行爲列名),或直接粘貼從 Excel 複製出的多列數據。多列各自獨立擬合,空值和非數值自動剔除,同時按 IQR 規則剔除離羣點,並在界面上給出剔除數量。

內置 23 個分佈族:正態、Logistic、Laplace、Cauchy、均勻、對數正態、Gamma、Weibull、指數、Rayleigh、逆高斯、對數 Logistic、Lomax(Pareto II)、Burr XII、疲勞壽命(BS)、Nakagami、Maxwell、χ²、半正態、Beta、Gumbel、GEV、GPD。它們按「位置-尺度型 / 正偏壽命型 / 極值型 / 有界與其他」分組展示,可以勾選、一鍵全選,也可以只用「常用」六族。

參數估計走極大似然:先用矩估計做初值,再網格細化和數值最小化。估計結果直接寫在表裏,參數以 μ 位置=…, σ 尺度=… 的中文形式呈現,置信區間/分位數與經驗分位數並列對照,方便判斷估計是否可靠。

檢驗與排名

檢驗部分提供 K-S、A-D、CvM、χ² 四種,默認輸出漸近 p 值,可以切換到「蒙特卡洛校準」模式(B=999 的參數自舉,更準但更慢)。表裏的 p 值可以按列勾選顯示,避免列太多時看不清。

排名使用 AIC / BIC / ΔAIC / Akaike 權重,可以按 AIC、BIC 或 K-S p 值排序,結論列直接給出「接受 / 部分拒絕 / 拒絕」三檔,減少自己判閾值的工作量。

圖表

圖表有四個頁籤:直方圖加各分佈 PDF 曲線、CDF 對比、P-P、Q-Q,全部用矢量 SVG 繪製。懸停顯示該分箱的頻數、密度和各分佈密度值;圖例可以點選高亮某一條曲線,曲線變多時自動摺疊成「+N 條曲線」。拖動閾值或切換曲線都在瀏覽器本地完成,因爲統計引擎是純 JS,所以反饋是即時的。

AI 解讀

每次算出結果後,面板把統計摘要交給 DSH 的模型通道,生成四段式解讀,直接顯示在 KPI 卡片下方:

  1. 數據說明了什麼:中心與離散、偏斜方向、尾部與極值、取值範圍、直方圖是否單峯或有空檔,以及這些特徵對背後過程意味着什麼(哪列更穩、哪裏可能有異常批次、高端或低端風險)。每個判斷都綁定摘要裏的具體數字。
  2. 推薦分佈與依據。
  3. 風險與注意事項。
  4. 下一步建議。

面板自己不保存任何密鑰。POST /api/dsh-distfit/explain 進入 Host 後,用 DSH 的 llm 服務按「助手當前默認模型」發起一次短補全:優先用 agentDefaultModel,取不到時自動挑一個可用的 provider/model。所以只要當前 profile 裏的模型通道可用,AI 解讀就能用;換模型、換 provider 都跟隨 DSH 設置,不需要改插件。模型調用發生在 Host 進程,瀏覽器側拿不到憑據。可以手動點「重新分析」,解讀也會寫進導出的 Markdown 報告。

小樣本提示

樣本量 n < 15 時面板頂部出現提醒;3–4 參數的分佈族(Beta / Burr / GPD 等)在排名裏帶 ⚠ 標記。這是爲了避免小樣本過擬合的結論被當成定論。

圖表導出

圖表卡片右上角點「導出圖」進入導出對話框,左側是所見即所得預覽,右側有三個頁籤:模板 / 樣式 / AI 調整。

可用的畫布尺寸包括 1280×720(16:9 幻燈片)、1600×900、1200×800、2400×1350、900×600 和自定義。樣式上可以調字號(0.5×–5×)、線寬(0.3×–6×)、圖例字號、位圖倍率(1×/2×/3×),可以切換灰度圖(按 BT.601 亮度換算,適合黑白印刷)、網格線、柱體描邊、透明背景、座標軸樣式(L 形或四邊全框)、圖例位置(下方 / 右側 / 不顯示)以及圖註標題。柱形圖還可以單獨調填充深淺(淺 / 中 / 深 / 空心)、柱間距(0–40 px)、柱體圓角(0–40 px)和柱體顏色;默認樣式是「淺色 + 細描邊 + 2 px 間隙 + 3 px 圓角」。

內置七套出圖模板,點一下就能把字體、尺寸、字號線寬、座標軸和圖例一起換掉:

  1. 默認(彩色·網格)
  2. 中文期刊·雙欄
  3. 英文期刊·單欄
  4. 學位論文
  5. 演示文稿·16:9
  6. 演示文稿·透明底
  7. 黑白打印

模板裏的字號線寬會隨畫布寬度配套放大(1800 px 時約 3× 字號),縮到論文欄寬後依然清晰。當前樣式可以存成自己的模板,存在 localStorage,可刪除,下次一鍵複用。

導出格式支持 SVG(矢量,文字仍是文字)、PNG、JPG、PDF,文件名形如 distfit-木材-density-20261105-151543.pdf。暗色主題下導出的圖會自動把淺色文字和參考線換成適合白底的深色。

預覽即導出:對話框先把當前圖表離屏渲染到 .df-export-stage 隱藏容器裏(尺寸等於導出像素),再用 buildExportSvg 序列化同一份 SVG 生成預覽,點導出時複用這份字符串,不會出現「預覽好看、導出變小」。

AI 調整圖表

在「AI 調整」頁籤裏用一句話描述用途,例如「投中文核心期刊,雙欄,灰度可打印,字號大一些」或「組會 PPT,深色底,字要大」。Host 半邊的模型會把它翻譯成一次樣式補丁(可以同時指定預設加覆蓋字段),應用到預覽並給出中文說明。模型只能改樣式字段,數據與統計結果不會被改動。

這條路走的是 POST /api/dsh-distfit/chart-style,請求 {request, context},返回 {ok, preset, style, notes, warnings}。Host 用字段白名單和範圍把模型輸出裁剪成合法補丁,模型不能注入任意 CSS/HTML。模型同樣來自 DSH 的 llm 服務與助手默認模型,調用發生在 Host 半邊。

典型用法

從面板走的完整流程可以是這樣:

  1. 從 Excel 複製多列數據,粘進面板輸入區,確認列名正確。
  2. 先用「常用」六族跑一遍,看 AIC 排序和 K-S p 的列勾選結果;結果不差再勾全選 23 族對比。
  3. 點開直方圖 + PDF 頁籤,在圖例裏點選排名靠前的兩個分佈,看曲線貼合程度。
  4. 改圖表樣式:挑一個論文模板,微調字號和柱體顏色,在「AI 調整」裏用一句話描述用途。
  5. 導出 PDF 或 SVG 用於論文,同時把排名表導成 CSV,或一鍵生成含 AI 解讀的 Markdown 報告。

需要對話中斷續做分析時,可以調用註冊好的 distfit_fit 工具,讓助手直接擬合數據並給出排名建議,宿主側複用同一份統計引擎。

項目結構與自檢

統計和界面代碼的分工是:src/engine/ 是純 JS 引擎(特殊函數、分佈族、描述統計、檢驗、編排),瀏覽器與 Host 共用;src/host/ 承載 distfit_fit 工具、AI 解讀和圖表樣式路由;src/client/ 是面板界面和導出邏輯。構建客戶端產物用 esbuild:

node build.mjs   # 生成 lib/client.js,改客戶端代碼後必須重新構建
npm test         # 八套自檢:引擎、端到端統計、Host 工具、AI 摘要、圖表導出、圖例、樣式、客戶端包冒煙
npm run test:chart   # 只跑圖表導出(灰度換算、文件名、PDF 結構)

適用場景與注意

適合科研場景下需要給一組數據找分佈、出可發表圖表的人,尤其是不想在 Python 腳本和繪圖工具之間來回切換的環境。如果是純建模任務,用 distfit_fit 工具即可;如果需要反覆調圖,面板那套模板和樣式控件更合適。

幾點注意:插件運行時使用的是當前 DSH 進程的權限,安裝前應當檢查源碼和許可證(本項目是 MIT,倉庫裏也提供了 README 和 docs/DESIGN.md 可以審閱);瀏覽器側不接觸憑據,AI 解讀的可用性取決於當前 profile 的模型通道。插件在社區目錄的分類是模型推理,Star 數爲 1,屬於剛起步的項目,遇到問題建議直接到 GitHub 提 issue。升級插件版本後記得重啓一次 DSH,Host 半邊的代碼在進程啓動時加載,不重啓的話 AI 卡片不會工作。

結尾

DistFit 的價值在於它把「擬合—檢驗—排名—解讀—出圖」這條科研裏常見的鏈路裝進了 DSH 面板,並且統計實現全部是純 JavaScript,不引入 Python 依賴,對只跑 DSH 的環境比較友好。

  • 目錄頁:https://www.skillhub.cn/plugins/stormx-u/dsh-easydistfit
  • GitHub:https://github.com/stormx-u/dsh-easydistfit
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜