如何找到估计位置相对于真实位置的标准偏差

问题描述 投票:0回答:2

我希望标题不要太混乱,但这是我能想到的最好的(随意建议更好的标题!)

我有一个物理传感器放置在房间的固定位置,例如坐标系中的(1、1、1、1)。该传感器能够估计其在坐标系中的位置。我让传感器在30秒的时间内每秒10次估算位置,因此总共有300个位置估算值保存到了文件中。]

现在,为了评估位置估计值,我计算了从每个估计值到参考点(1、1、1)的距离,并将所有距离保存到列表中。我想找出到参考点的距离的标准偏差(1、1、1)。

我对标准差的计算并不熟悉,但正如我所建议的多种解释和指导一样,1)计算所有距离的平均值2)从每个距离中减去均值并将其平方3)将步骤2)中的所有值添加到列表中并计算其平均值4)取均值的平方根

但是,我认为我不应该在步骤2中使用计算出的距离的平均值,而应该使用0值,因为我不想计算出计算出的距离与平均值的标准偏差,但对我的参考而言点(1、1、1)。因为我的参考点到自己的距离显然为0,所以我认为这可能是正确的方法。

这是我的python脚本:

import sys
from math import sqrt, pow

# Returns the amount of samples collected - necessary for mean and standard deviation calculations
def get_sample_count(filename):
    with open(filename) as f:
        for i, l in enumerate(f):
            pass
    return i + 1

def distanceBetweenTwoPoints2D(sample_point, reference_point):
    return sqrt(pow(sample_point[0] - reference_point[0], 2) + pow(sample_point[1] - reference_point[1], 2))

def distanceBetweenTwoPoints3D(sample_point, reference_point):
    return sqrt(pow(sample_point[0] - reference_point[0], 2) + pow(sample_point[1] - reference_point[1], 2) + pow(sample_point[2] - reference_point[2], 2))

def standard_deviation(distances_2D, sample_distance_mean_2D, distances_3D, sample_distance_mean_3D, sample_count):
    squared_distances_2D = []
    squared_distances_3D = []
    for distance in distances_2D:
        squared = pow(distance - 0, 2)
        squared_distances_2D.append(squared)
    for distance in distances_3D:
        squared = pow(distance - 0, 2)
        squared_distances_3D.append(squared)

    std2D = sqrt(sum(squared_distances_2D) / sample_count)
    std3D = sqrt(sum(squared_distances_3D) / sample_count)

    return std2D, std3D

def evaluateData(filename, reference_point):
    sample_x_mean = 0.0
    sample_y_mean = 0.0
    sample_z_mean = 0.0
    distances_2D = []
    distances_3D = []

    sample_count = get_sample_count(filename)

    with open(filename) as file:
        for line in file:
            x = float(line.split(',')[0])
            y = float(line.split(',')[1])
            z = float(line.split(',')[2])

            # Add individual coordinates to means
            sample_x_mean += x
            sample_y_mean += y
            sample_z_mean += z

            # Calculate distance in 2D and 3D and add to distances lists
            sample_point = [x, y, z]
            sample_distance_2D = distanceBetweenTwoPoints2D(sample_point, reference_point)
            sample_distance_3D = distanceBetweenTwoPoints3D(sample_point, reference_point)
            distances_2D.append(sample_distance_2D)
            distances_3D.append(sample_distance_3D)

    sample_x_mean /= sample_count
    sample_y_mean /= sample_count
    sample_z_mean /= sample_count
    sample_distance_mean_2D = sum(distances_2D) / sample_count
    sample_distance_mean_3D = sum(distances_3D) / sample_count
    std2D, std3D = standard_deviation(distances_2D, sample_distance_mean_2D, distances_3D, sample_distance_mean_3D, sample_count)

    return sample_count, sample_x_mean, sample_y_mean, sample_z_mean, sample_distance_mean_2D, sample_distance_mean_3D, std2D, std3D

if __name__ == "__main__":
    filename = sys.argv[1]
    direction = filename.split('(')[0]
    x_reference = float((filename.split('(')[1].split(')')[0].split('_')[0]).replace(',', '.'))
    y_reference = float((filename.split('(')[1].split(')')[0].split('_')[1]).replace(',', '.'))
    z_reference = float((filename.split('(')[1].split(')')[0].split('_')[2]).replace(',', '.'))
    reference_point = [x_reference, y_reference, z_reference]

    print("\n")
    sample_count, x_mean, y_mean, z_mean, distance_mean_2D, distance_mean_3D, std2D, std3D = evaluateData(filename, reference_point)
    print("DIRECTION: {}, SAMPLE COUNT: {}".format(direction, sample_count))
    print("X REFERENCE: {}, Y REFERENCE: {}, Z REFERENCE: {}".format(x_reference, y_reference, z_reference))
    print("X MEAN: {}, Y MEAN: {}, Z MEAN: {}".format(x_mean, y_mean, z_mean))
    print("DISTANCE MEAN 2D: {}, DISTANCE MEAN 3D: {}".format(distance_mean_2D, distance_mean_3D))
    print("STD2D: {}, STD3D: {}".format(std2D, std3D))
    print("\n")

有人能证明我是对还是错?

问候

我希望标题不要太混乱,但是这是我能想到的最好的(随意建议更好的标题!)我在房间的固定位置放置了一个物理传感器,例如(1、1、1)在...

python standard-deviation
2个回答
0
投票

两件事:1)如果您已经在distanceBetweenTwoPoints [23] D()中计算了参考点和观察点之间的距离,则不希望将参考点用作平均值。计算中已经包含了这一点。

© www.soinside.com 2019 - 2024. All rights reserved.