2014-02-16 108 views
3

我有一組測量的半徑(t + epsilon +誤差)在等間距角度。 該模型是以(r,Alpha)爲中心的半徑(R)的圓,加上小噪聲和一些比噪聲大得多的隨機誤差值。Python圈擬合數據點對隨機噪聲不太敏感

問題是要找到圓模型(r,Alpha)的中心和圓的半徑(R)。但它不應該對隨機誤差過於敏感(在7和14下方的數據點中)。

某些半徑可能會丟失,因此簡單的意思就不適用了。

我試過最小平方優化,但它對錯誤作出了重大反應。

有沒有一種方法來優化最小delta,但不是delta中的最小平方?

Model: 
n=36 
R=100 
r=10 
Alpha=2*Pi/6 

Data points: 
[95.85, 92.66, 94.14, 90.56, 88.08, 87.63, 88.12, 152.92, 90.75, 90.73, 93.93, 92.66, 92.67, 97.24, 65.40, 97.67, 103.66, 104.43, 105.25, 106.17, 105.01, 108.52, 109.33, 108.17, 107.10, 106.93, 111.25, 109.99, 107.23, 107.18, 108.30, 101.81, 99.47, 97.97, 96.05, 95.29] 

+0

你只是想拋棄異常值? –

+0

@SlaterTyranus是的,我希望它們不會對我的裝配圈產生影響 – Oscar

回答

1

在回答你的最後一個問題

有沒有辦法來優化至少增量而不是增量的最小二乘在Python?

是的,選擇一種優化方法(例如在scipy.optimize.fmin中實施的下坡單純形法),並將絕對偏差之和作爲評價函數。你的數據集很小,我想任何通用優化方法都會很快收斂。 (在非線性最小二乘擬合的情況下,也可以使用通用優化算法,但使用最小化平方和的Levenberg-Marquardt算法更爲常見。)

如果你最小化,而不是正方形絕對偏差時,有興趣有理論依據看數字食譜,章穩健估計

從實際出發,絕對偏差之和可能沒有唯一的最小值。 (0,5)和(1,9)以及常數函數y = a,在5和9之間的任何值a給出相同的總和(4)。偏差平方時不存在這樣的問題。

如果最小化絕對偏差不起作用,您可以考慮啓發式過程來識別和刪除異常值。如RANSACROUT

2

這似乎是你的主要問題就在這裏將被移除異常值。有幾種方法可以做到這一點,但對於您的應用程序,您最好的選擇是根據距離中位數的距離來移除項目(因爲中位數對異常值的敏感度遠低於平均值)。

如果您使用numpy那會是這樣的:

def remove_outliers(data_points, margin=1.5): 
    nd = np.abs(data_points - np.median(data_points)) 
    s = nd/np.median(nd) 
    return data_points[s<margin] 

之後,你應該運行最小二乘。

如果你不使用numpy你可以用本機Python列表類似的東西:

def median(points): 
    return sorted(points)[len(points)/2] # evaluates to an int in python2 

def remove_outliers(data_points, margin=1.5): 
    m = median(data_points) 
    centered_points = [abs(point - m) for point in data_points] 
    centered_median = median(centered_points) 
    ratios = [datum/centered_median for datum in centered_points] 
    return [point for i, point in enumerate(data_points) if ratios[i]>margin] 

如果你正在尋找剛剛不算異常的高,你可以纔算數據集的平均值,這只是最小二乘優化的線性等價。

如果你正在尋找一些更好的東西,我可能會建議通過某種low pass filter投擲你的數據,但我不認爲這是真的需要在這裏。

的低通濾波器很可能是最好的,你可以做如下(注意,alpha是一個數字,你將不得不與獲得所需輸出亂動。)

def low_pass(data, alpha): 
    new_data = [data[0]] 
    for i in range(1, len(data)): 
     new_data.append(alpha * data[i] + (1 - alpha) * new_data[i-1]) 
    return new_data 

在哪一點你的最小二乘優化應該可以正常工作。

+0

感謝您的回覆。問題在於異常值的大小沒有定義,因此我正在尋找可以像最小二乘法優化但不能用於正方形的代碼,以最大限度地減少外部對總體結果的貢獻。 – Oscar

+0

@Oscar上述代碼對於異常值並不承擔任何規模,只是與標準有偏差。 –

+0

@Oscar更新後的答案是否有幫助? –