4

我有一组等距角度的测量半径(t+epsilon+error)。该模型是一个以 (r, Alpha) 为中心的半径 (R) 圆,添加了小噪声和一些比噪声大得多的随机误差值。

问题是找到圆模型的中心(r,Alpha)和圆的半径(R)。但它不应该对随机误差过于敏感(在下面的数据点 7 和 14)。

一些半径可能会丢失,因此简单的平均值在这里不起作用。

我尝试了最小二乘优化,但它对错误有很大的反应。

有没有办法在 Python 中优化最小增量而不是最小二乘?

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]

4

2 回答 2

3

看来您的主要问题将是消除异常值。有几种方法可以做到这一点,但对于您的应用程序,您最好的选择可能是根据它们与中位数的距离来删除项目(因为中位数对异常值的敏感度远低于平均值。)

如果您正在使用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]

如果您只想不高度计算异常值,您可以计算数据集的平均值,这只是最小二乘优化的线性等价物。

如果您正在寻找更好的东西,我可能会建议您将数据通过某种低通滤波器,但我认为这里并不需要这样做。

低通滤波器可能是最好的,您可以按以下方式进行操作:(注意,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

此时您的最小二乘优化应该可以正常工作。

于 2014-02-16T07:57:20.637 回答
2

回答你的最后一个问题

有没有办法在 Python 中优化最小增量而不是最小二乘?

是的,选择一种优化方法(例如在 中实现的下坡单纯形法scipy.optimize.fmin)并使用绝对偏差的总和作为评价函数。你的数据集很小,我想任何通用的优化方法都会很快收敛。(在非线性最小二乘拟合的情况下,也可以使用通用优化算法,但更常见的是使用最小化平方和的 Levenberg-Marquardt 算法。)

如果您对最小化绝对偏差而不是平方有理论依据感兴趣,请参阅数值配方稳健估计一章。

从实际角度来看,绝对偏差的总和可能没有唯一的最小值。在两个点的简单情况下,例如 (0,5) 和 (1,9) 以及常数函数y=a,任何介于 5 和 9 之间的a值都会给出相同的和 (4)。当偏差平方时不存在这样的问题。

如果最小化绝对偏差不起作用,您可以考虑使用启发式程序来识别和删除异常值。例如RANSACROUT

于 2014-02-17T01:54:01.710 回答