昨天的手寫字留了一個待辦:把 arXiv 2401.16519(Ferrer 等人)的全文讀完。今天讀完了,結論先給:在這篇論文的 Table 1 裡,IAM On-Line 白板手寫資料用高斯鐘形重建速度的 SNRv 是 17.68 dB,用對數常態是 17.66 dB,差 0.02 dB,而每格的標準差是 5.7 到 5.8 dB。Sigma-Lognormal 傳統上拿 SNRv 當「動作有多對數常態」的指標,但這個指標在真實手寫資料上分不出對數常態與高斯。我用合成資料驗了一遍,原因不神秘:一旦誤差裡有雜訊,10 dB 的模型差異只會在 SNRv 上剩 0.5 dB 左右;而且一個偏態的對數常態鐘,可以被兩個高斯鐘以 27.9 dB 的精度取代,筆畫數因此變得不確定。反過來,單獨一筆、乾淨的筆畫,形狀其實分得出來(σ 在 0.3 以上時 BIC 在 5% 與 10% 雜訊下都是 100% 選對數常態)。所以「σ 能不能當形狀參數」的答案是:單筆可以,多筆重疊並用 SNRv 評分時不行。

昨天待辦的對帳:Lacquaniti、Terzuolo 與 Viviani 1983 年原文我今天又搜了一次,仍然沒有全文,只從搜尋結果確認書目是 Acta Psychologica 54 卷 115–130 頁、DOI 為 10.1016/0001-6918(83)90027-6(二手資訊),維持待辦。10-07 墨膜實驗與實測 s、一長筆 σ 都需要真人實際書寫或拍照,我做不了,維持待辦。今天沒有任何真人書寫資料,所有數字不是論文(會標出處)就是我的合成資料模擬。

📖 學

一、今天實際讀了什麼,以及模型的完整形式

我下載了兩篇 arXiv PDF,用 pypdf 轉成文字後讀:Ferrer、Diaz、Quintana、Carmona-Duarte 與 Plamondon 的〈Extending the Kinematic Theory of Rapid Movements with new Primitives〉(arXiv 2401.16519,PDF 第一頁標示 2024 年 1 月 31 日提交的預印本,共 10 頁,正文與 Table 1、Table 2 都讀了,圖沒有逐張看),以及同一組人的〈iDeLog〉(arXiv 2401.15473,12 頁,讀了模型回顧、筆畫抽取流程與 SNR 定義,實驗表格只讀了開頭幾列)。WebFetch 對 2401.16519 摘要頁的整理寫「Published in Pattern Recognition Letters, March 2023」,但 PDF 本身只寫預印本,我沒有核實正式刊登資訊,不採用。

多筆畫的完整形式,出自 iDeLog 論文第二節。昨天只處理了單一對數常態,現在補上疊加規則:每個筆畫 j 有自己的 D、t0、μ、σ 與一段圓弧,圓弧由起始角 θs 與結束角 θe 決定,速度向量是各筆畫沿弧切線方向的對數常態速度加總:

v(t) = Σ_j D_j · Λ(t; t0j, μj, σj) · ( cos φ_j(t), sin φ_j(t) )

其中角度隨時間掃過的方式也是對數常態的:φ_j(t) = θs_j + (θe_j − θs_j) · ½ · [1 + erf( (ln(t − t0j) − μj) / (σj √2) )]。括號裡的 ½·[1 + erf] 正是標準常態累積分布函數,所以昨天我們擬合的累積路徑長其實就是這個模型裡「這一筆已經走完的比例」。(論文式 2 在我的文字抽取裡出現 D 乘了兩次,我判斷是排版或抽取瑕疵,上面用的是一次 D 的標準寫法。)筆畫與筆畫在時間上重疊,「前一筆還沒收完、下一筆已經開始」,這就是連寫的字形成平滑曲線的方式,也是為什麼單筆模型不夠用。

抽取流程(iDeLog 論文第二節):先把座標重新取樣到 200 Hz、用 Chebyshev 濾波器平滑;在速度大小曲線上找每個「葉」的最大值與兩個反曲點,由這三點反推 t0、μ、σ;把這個筆畫的速度減掉,看有沒有被較快鄰居蓋住的小峰;計算 SNRv = 10·log( ∫ vo² dt / ∫ (vo − vr)² dt ),vo 是平滑後的原始速度、vr 是重建速度;SNRv 超過門檻、筆畫數超過上限或找不到更多候選點就停。論文原文把這個量稱為「被視為動作對數常態程度的指標」,這是下面所有討論的起點。Ferrer 論文引用的品質門檻是:SNRv 與 SNRt(軌跡)各自大於 15 dB 就算好的近似(論文引自它的參考文獻 20,我沒有追那一篇)。

二、Ferrer 論文的 Table 1:鐘形換掉,分數幾乎不動

這篇論文把「速度鐘形」與「連結虛擬目標點的曲線」都做成可替換的零件,前者試了高斯、Gamma、Beta、對數常態、雙界對數常態(DBL)與廣義極值(GEV),後者試了圓弧與 clothoid(歐拉螺線)。資料包含兩個簽名資料庫(BiosecureID、MCYT100)、IAM On-Line 白板手寫、11 隻狗各超過 40 分鐘的行走,以及機械手臂在 Wacom Intuos Pro A4 上寫的 100 個塗鴉。下面摘 Table 1 用圓弧的 SNRv 欄(括號是論文給的標準差),「最大差距」是我自己從六個鐘形的平均值算的最大減最小:

資料高斯對數常態GammaBetaDBLGEV最大差距(自算)
BiosecureID19.22(1.16)18.94(1.19)19.0719.1718.8018.730.49 dB
MCYT10017.94(1.20)17.74(1.21)17.8217.9417.7817.350.59 dB
手寫(IAM)17.68(5.83)17.66(5.71)17.6417.7617.5717.220.54 dB
機械手臂21.47(1.63)21.50(1.58)21.6021.4220.7620.141.46 dB
狗18.84(2.57)18.97(2.38)19.0218.9318.4619.100.64 dB

算例:手寫列 17.76 − 17.22 = 0.54;機械手臂 21.60 − 20.14 = 1.46。論文自己的結論與表一致:簽名資料上高斯與 Beta 的平均略好,手寫上 Beta 略好,機器人沒有明確偏好,而且統計檢定顯示高斯與 DBL、GEV 在手寫的 SNRv 上有顯著差異(p 小於 0.05),對數常態與 DBL、GEV 也有。論文文字裡把虛無假設寫成「p 大於 0.05 時可以被拒絕」,方向寫反了,但後面的判讀(p 小於 0.05 才算顯著)是對的,我照後者讀。

有三個我不能確定的地方。其一,表裡的 N(重建用的筆畫數)沒有直接給,只有 SNR/N 這種比值,所以我不能說各鐘形是在「同樣筆畫數」下比較;如果用了不同筆畫數,SNRv 相同就更不能解讀。其二,這是 IAM 的白板手寫,不是觸控筆書寫,取樣與抖動特性都不同。其三,論文是同一組人開發 iDeLog 與 Sigma-Lognormal 的延伸,結論「新零件有用」與「舊零件(對數常態)不是唯一選擇」都出自他們自己。這個結果我看成「SNRv 這一個指標不具鑑別力」的證據,不是「手寫其實是高斯」的證據。

三、為什麼:雜訊把差異壓平(單筆實驗)

單筆乾淨的情況下,形狀差異很明顯。我把 D = 1、t0 = 0.05、μ = −1 的對數常態速度曲線(0 到 1.5 秒、100 Hz)直接拿高斯、Gamma(帶 t0,四參數)去擬合,無雜訊,SNRv 用上面的式子:

σ偏度高斯擬合 SNRvGamma 擬合 SNRv
0.10.3027.3 dB57.9 dB
0.20.6121.3 dB45.9 dB
0.30.9517.9 dB39.0 dB
0.41.3215.5 dB34.2 dB
0.62.2612.4 dB27.9 dB

σ = 0.3 時高斯擬合只有 17.9 dB,σ = 0.4 時掉到剛過 15 dB 的門檻,σ = 0.6 就不及格。反方向,真高斯(平均 0.4 秒、標準差 0.12 秒)用對數常態擬合得 24.8 dB,擬合出的 σ 為 0.133。雜訊加進來之後,我重複 200 次,雜訊標準差取峰值的 5% 與 10%,比較高斯(三參數)與對數常態(四參數)的 BIC(n·ln(RSS/n) + k·ln n,n = 150),看 BIC 選對數常態的比例,真值是對數常態:

真值 σ5% 雜訊 BIC 選對數常態10% 雜訊高斯擬合對乾淨真值的 SNRv(5%)對數常態擬合(5%)
0.158%14%25.3 dB29.3 dB
0.2100%80%21.0 dB32.4 dB
0.3100%100%17.8 dB34.2 dB
0.4100%100%15.5 dB35.4 dB
高斯真值0%2%36.3 dB24.3 dB

單一孤立筆畫,σ 在 0.3 以上時形狀問題分得清楚。σ = 0.1 時在 10% 雜訊下只有 14% 選對,這種接近對稱的筆畫本來就分不出來。表裡最後兩欄是「與沒有雜訊的真值比」,所以高斯與對數常態在這一列的差距(σ = 0.3 為 16.4 dB)才是模型誤差的真實大小。

四、多筆重疊:差異被壓進 0.5 dB(三筆畫實驗)

接著我照上面的完整式子做了三筆畫合成:三個筆畫的角度(θs, θe)為 (0.2, 0.9)、(1.2, 2.2)、(2.4, 3.3) 弧度,D = 1、1.3、0.8,t0 = 0.05、0.17、0.29 秒,μ 約 −1.3 或 −1.2,三筆 σ 一樣,200 Hz 取樣。擬合時角度與筆畫數都當成已知(這對兩邊都是最有利的設定),只擬合時間參數:對數常態每筆四個、共 12 個;高斯每筆三個、共 9 個(相位用高斯累積分布)。SNRv 都用 vx 與 vy 合成的速度大小算:

真值 σ無雜訊,高斯 SNRv5% 雜訊:對數常態 / 高斯(對觀測值)純雜訊的天花板對乾淨真值:對數常態 / 高斯
0.224.3 dB16.1 / 15.2 dB15.3 dB34.9 / 24.2 dB
0.326.1 dB15.6 / 15.4 dB16.2 dB34.9 / 25.7 dB
0.427.4 dB17.1 / 16.8 dB16.9 dB35.5 / 27.4 dB

這裡「純雜訊的天花板」是觀測速度大小與乾淨速度大小之間的 SNRv(50 次平均)。高斯模型對乾淨真值有 24 到 27 dB,對數常態有 35 dB,差距約 10 dB,但兩者對有雜訊的觀測值只差 0.2 到 0.9 dB,而且對數常態在 σ = 0.2 時的 16.1 dB 還略高於天花板 15.3 dB(12 個參數會多擬合到一些雜訊)。算式:雜訊占比 10^(−1.6) = 0.0251(對應 16 dB);高斯的模型誤差 −25 dB 即 10^(−2.5) = 0.00316,總和 0.0283,對應 15.5 dB;對數常態的模型誤差 −35 dB 為 0.000316,總和 0.0254,對應 16.0 dB;差 0.46 dB,與模擬的 0.2 到 0.9 dB 相符。這是我自己的合成資料,雜訊是假設成每個速度分量標準差等於峰值速度的 5%,這在真實資料裡通常不成立,但方向很清楚:只要觀測誤差裡有一個固定的雜訊底,10 dB 的模型差異被稀釋成不到 1 dB。

真實 IAM 手寫的 SNRv 為 17.7 dB,誤差占比 10^(−1.77) = 0.0170。這個誤差裡有多少是雜訊、多少是筆畫抽取不完美、多少是模型形狀不對,Table 1 看不出來。Table 1 的結果與「雜訊或抽取誤差主導」相容,也與「所有鐘形都不太對」相容,我沒辦法由它排除任何一個。

五、一個偏態鐘約等於兩個高斯鐘:筆畫數的不確定

還有一個與筆畫數有關的效應。我用兩個高斯鐘(各自有幅度、平均、標準差,共六個參數)去擬合單一對數常態,無雜訊:

真值 σ單高斯兩高斯兩高斯的權重兩個峰的位置峰距
0.317.9 dB27.9 dB0.50 / 0.490.368 / 0.485 秒0.117 秒
0.415.5 dB24.3 dB0.48 / 0.500.348 / 0.509 秒0.161 秒
0.612.4 dB19.4 dB0.45 / 0.520.306 / 0.543 秒0.237 秒

σ = 0.3 時,兩個權重幾乎相等的高斯,在 0.117 秒間隔下,精度比單高斯高 10.0 dB(27.9 − 17.9)。如果真實資料的手寫其實是單一偏態的鐘,而抽取器的鐘形是對稱的(例如 Table 1 裡高斯那一欄),它會傾向多報一筆,而且新增的那一筆距離上一筆約 0.1 秒。iDeLog 論文的討論段落寫,相鄰筆畫的出現時間差 t0j − t0j−1 落在 0.05 到 0.12 秒,「與中樞模式產生器(CPG)相符」。我要明說:這是峰距與出現時間差兩個不同的量,我並不是在說他們的資料有這個假象;我只是說,筆畫數與筆畫間隔這兩個「生理意義」的結果,同時依賴鐘形假設,在單用 SNRv 評分的流程裡,沒有東西阻止偏態被拆成兩筆。

六、對昨天的修正與定位

昨天我寫 Ferrer 論文「提出用其他分布(高斯、Beta、Gamma 等)取代對數常態」,今天讀全文,更精確的說法是:它提出一個框架,允許換掉鐘形與曲線,並報告換掉之後 SNRv 差不多;它沒有主張對數常態不對。昨天我也把 σ 當成可以解讀的形狀量,今天的結果修正這點:單獨一筆乾淨、σ 在 0.3 以上時,形狀量是可以辨識的;在重疊的多筆資料上,只拿 SNRv 當標準,σ 與筆畫數會彼此互相補償,不能單獨解讀。這與昨天讀到的 Latash 與 Schöner 的批評一致:對數常態是好用的描述形式,不是機制證明,而今天補了一個實務理由,就是連評分指標本身也分不出它與替代形式。

🧠 記

**一、多筆畫模型:**v(t) = Σ D_j·Λ(t; t0j, μj, σj)·(cos φ_j, sin φ_j),φ_j(t) = θs_j + (θe_j − θs_j)·Φ((ln(t − t0j) − μj)/σj)。來源是 iDeLog 論文第二節,Φ 是標準常態累積分布。昨天擬合的累積路徑長就是 Φ 這一項。

**二、SNRv 的定義:**10·log(∫vo² / ∫(vo − vr)²),被當作「對數常態程度」的指標,但 Ferrer 2024 的 Table 1 顯示高斯 17.68、對數常態 17.66、Gamma 17.64、Beta 17.76 dB(IAM 手寫,圓弧),六種鐘形最大差距 0.54 dB,而標準差 5.6 到 7.0 dB。

**三、為什麼分不出(我的模擬):**SNRv 對觀測值算,誤差 = 雜訊加模型誤差。雜訊 −16 dB 加高斯模型誤差 −25 dB,總和 15.5 dB;對數常態 −35 dB,總和 16.0 dB,只差 0.46 dB,雖然對乾淨真值差 10 dB。

**四、單筆可分、多筆難分:**孤立單筆,σ 在 0.3 以上時 BIC 選對數常態 100%(5% 與 10% 雜訊),σ = 0.1 時 10% 雜訊下只有 14%。多筆重疊時,SNRv 不是好的鑑別量。

**五、筆畫數不確定:**σ = 0.3 的單一對數常態,兩個高斯(權重 0.50 與 0.49,峰距 0.117 秒)可到 27.9 dB,比單高斯多 10.0 dB。

**邊界:**Ferrer 與 iDeLog 都是 PDF 轉文字,圖與部分表格沒細讀,N 沒給;三筆畫模擬把角度與筆畫數當已知,雜訊是假設值,沒有真實筆跡資料;Lacquaniti 1983 原文仍未取得。

✍️ 實踐

用 30 分鐘,檢查自己「一長筆」是不是看得出對數常態,並知道看不出時該怎麼判斷。需要昨天的 iso.html(輸出欄位 k,標籤,時間毫秒,x,y,d)與 scipy,輸出檔以下稱 iso.csv。

第一步,存成 bell_cmp.py。它對每一筆孤立筆畫,用累積路徑長(不做微分)分別擬合高斯 CDF(三參數)與對數常態 CDF(四參數),輸出兩者殘差 RMS 與 BIC 差(對數常態減高斯,負值代表對數常態好)。我用合成資料測過四組(每組 15 筆,長度 100、200、400 像素,座標雜訊 0.3 或 1.0 像素):真值對數常態 σ = 0.3,三種長度的 BIC 差中位數為 −268、−418、−655;σ = 0.1,為 −6(判定「不分」)、−23、−67;雜訊 1.0 像素時為 −164、−201、−347;真值高斯時為 −10(不分)、+132、+280(判定「高斯」)。最後一組的對數常態擬合可能被初值或 t0 下界卡住,我沒有逐筆檢查,所以那兩個正值只當方向,不當判別率。沒有在真人或實機觸控筆上跑過。

import numpy as np, sys, csv
from collections import defaultdict
from scipy.optimize import curve_fit
from scipy.special import erfc
def sg(x, w, p):
    h = w // 2
    C = np.linalg.pinv(np.vander(np.arange(-h, h + 1), p + 1, increasing=True))[0]
    return np.convolve(np.pad(x, h, mode="edge"), C[::-1], mode="valid")
def cdf_ln(t, D, t0, mu, s):
    x = np.maximum(t - t0, 1e-9); return D * 0.5 * erfc(-(np.log(x) - mu) / (s * np.sqrt(2)))
def cdf_g(t, D, m, s): return D * 0.5 * erfc(-(t - m) / (s * np.sqrt(2)))
strokes = defaultdict(list); cur = defaultdict(list)
for k, lab, t, x, y, d in csv.reader(open(sys.argv[1])):
    cur[(k, lab)].append((float(t), float(x), float(y)))
    if int(d) == 0: strokes[lab].append(cur.pop((k, lab)))
print("%-6s %3s %7s %7s %7s %8s %7s  %s" % ("標籤", "n", "sigma", "rmsLN", "rmsG", "dBIC", "LN勝率", "判定(中位數 dBIC:<-10 對數常態,>10 高斯,其餘不分)"))
for lab in sorted(strokes, key=lambda l: len(strokes[l][0])):
    rl, rg, db, sgm = [], [], [], []
    for pts in strokes[lab]:
        t, x, y = map(np.array, zip(*pts)); t = (t - t[0]) / 1000.0
        if len(t) < 15: continue
        w = min(len(t) // 2 * 2 - 1, 9); x, y = sg(x, w, 3), sg(y, w, 3)
        S = np.concatenate([[0], np.cumsum(np.hypot(np.diff(x), np.diff(y)))]); T = t[-1]; n = len(t)
        try:
            pl, _ = curve_fit(cdf_ln, t, S, p0=[S[-1]*1.02, -0.1, np.log(T*0.4), 0.3],
                              bounds=([S[-1]*.5, -0.5, -5, 0.05], [S[-1]*1.6, 0.3, 2, 1.2]), maxfev=5000)
            pg, _ = curve_fit(cdf_g, t, S, p0=[S[-1]*1.02, T*0.4, T*0.15],
                              bounds=([S[-1]*.5, 0, 0.01], [S[-1]*1.6, T, T]), maxfev=5000)
        except Exception: continue
        e1 = np.sum((S - cdf_ln(t, *pl))**2); e2 = np.sum((S - cdf_g(t, *pg))**2)
        rl.append(np.sqrt(e1/n)); rg.append(np.sqrt(e2/n))
        db.append((n*np.log(e1/n) + 4*np.log(n)) - (n*np.log(e2/n) + 3*np.log(n))); sgm.append(pl[3])
    db = np.array(db)
    md = np.median(db); v = "對數常態" if md < -10 else ("高斯" if md > 10 else "不分")
    print("%-6s %3d %7.3f %7.2f %7.2f %8.1f %6.0f%%  %s" % (lab, len(db), np.mean(sgm), np.mean(rl), np.mean(rg), md, 100*np.mean(db < 0), v))

第二步,寫字。用 iso.html,每次只寫一長筆(例如漢字「一」的橫畫),不停頓、不回鋒。昨天的實驗若還沒做,現在做:2、4、8 公分各 5 筆,共 15 筆,順序打散,「大小標籤」欄填 2cm、4cm、8cm。執行 python3 bell_cmp.py iso.csv。

第三步,判讀,對照下面三個預測。預測一:至少有一組(長度)的中位數 BIC 差小於 −10,代表你的長筆畫有可辨識的不對稱,對數常態比高斯好;σ 欄(對數常態擬合的 σ)應落在 0.15 到 0.5 之間。預測二:σ 較小的那一組(多半是最大的字),BIC 差會比較接近 0,這與單筆模擬一致(σ = 0.1 時差只有 −6)。預測三:若三組都在 −10 到 +10 之間,結論是「這個資料分不出」,不要硬報誰比較好;這與論文表格的結果同向,但論文是多筆重疊的資料,不是同一種情形。

第四步,品質檢查:每組只有 5 筆,若某組的 LN勝率 低於 80% 而中位數仍小於 −10,代表有幾筆有遲疑或回鋒,拿掉再算;累積路徑受座標抖動影響(昨天的結果:雜訊占筆畫長 1% 就讓 σ 偏高 22%),所以 σ 欄只看大小量級。BIC 假設殘差獨立,但擬合累積路徑的殘差有時間相關,BIC 絕對值會偏樂觀,只把 −10 與 +10 當粗略門檻,不要當檢定。

限制:一個人、一種裝置,螢幕上的單一橫畫,比連寫的字簡單得多;單筆結果不能推到多筆重疊(今天第四節就是在說這一點);合成資料裡 Gaussian 真值的判定不可靠(見上)。

🔗 延伸學習


💬 問 AI

我在檢查 Sigma-Lognormal 模型的評分指標。請逐項回答,並嚴格區分三類:(一)原文明確寫了的、(二)你能查證或憑訓練資料確定的、(三)純屬推論的,每項標明把握程度(高/中/低);查不到或不確定就直說,不要編造文獻、數字或公式。這是學習與實驗設計。
 
【A 組:指標】
1. iDeLog 與 ScriptStudio 的 SNRv = 10·log(∫vo² / ∫(vo−vr)²),被用來當「動作對數常態程度」的指標。Ferrer 等人 2024(arXiv 2401.16519)Table 1 顯示高斯、對數常態、Gamma、Beta 鐘形的 SNRv 在 IAM 手寫上只差 0.02 到 0.1 dB,最大差距 0.54 dB。這個結果在文獻裡有沒有被討論過?有沒有人提出更能鑑別形狀的指標(例如對乾淨真值、似然比、殘差自相關)?
2. 我的推論:SNRv 對觀測值算,誤差 = 雜訊 + 模型誤差,雜訊 −16 dB 加高斯模型誤差 −25 dB 得 15.5 dB,加對數常態 −35 dB 得 16.0 dB,所以 10 dB 的模型差異只剩 0.46 dB。這個算術與推論合理嗎?
 
【B 組:筆畫數】
3. 我模擬:σ = 0.3 的單一對數常態可被兩個權重約 0.5、峰距 0.117 秒的高斯以 27.9 dB 取代(單高斯 17.9 dB)。ScriptStudio 與 iDeLog 的抽取流程(找最大值與反曲點、扣除、再找)會不會因此在偏態筆畫上多報筆畫?文獻有沒有量過筆畫數對鐘形假設的敏感度?
4. iDeLog 論文說相鄰筆畫的 t0 差 0.05 到 0.12 秒,與 CPG 相符。這個數字有沒有可能同時受鐘形與抽取演算法影響?
 
【C 組:單筆】
5. 我用累積路徑長擬合高斯與對數常態 CDF,以 BIC(k·ln n)比較,σ 在 0.3 以上時 100% 選對數常態、σ = 0.1 時 10% 雜訊下只有 14%。殘差有時間相關,BIC 還適用嗎?有沒有更適合的準則?
 
【D 組】
6. 把所有存疑項目分成三堆:(一)憑訓練資料就能判斷的、(二)必須查一手文獻的(請列出先查哪幾篇)、(三)必須用實際書寫資料才能回答的。