Как узнать стандартное отклонение оценочных позиций от реальной позиции в мире - PullRequest
0 голосов
/ 17 июня 2020

Надеюсь, название не слишком сбивает с толку, но это лучшее, что я мог придумать (не стесняйтесь предлагать лучшие названия!)

У меня есть физический датчик, расположенный в фиксированном месте в комнате, скажем (1, 1, 1) в системе координат. Этот датчик может оценить свое положение в системе координат. Я позволяю датчику оценивать положение 10 раз в секунду в течение 30 секунд, так что всего у меня есть 300 оценок положения, которые сохраняются в файл.

Теперь, чтобы оценить оценки положения, Я рассчитал расстояние от каждой оценки опорной точки (1, 1, 1) и сохранены все расстояния к списку. Я хотел бы узнать стандартное отклонение расстояний до контрольной точки (1, 1, 1).

Я не так хорошо знаком с вычислением стандартных отклонений, но, как предлагалось в нескольких объяснениях и руководствах, я должен 1) вычислить среднее значение всех расстояний 2) вычесть среднее значение из каждого отдельного расстояния и возвести его в квадрат 3) сложить все значения из шага 2) в список и вычислить их среднее значение 4) возьмите квадрат root среднего

Но, я думаю, мне не следует использовать среднее значение рассчитанных расстояний на шаге 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")

Кто-нибудь может доказать, что я прав или неправильно?

С уважением

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

Код отображается правильно рассчитать расстояние до контрольной точки, а затем вычислить root средний квадрата этих расстояний.

1002 * (Существует проблема эффективности минорной с оценкой квадратным root когда применяя теорему Пифагора только для повторного возведения расстояний в квадрат во время вычисления RMS, но для 300 точек об этом не стоит беспокоиться.)

Если заявленной целью является вычисление стандартного отклонения расстояний, тогда вы должны необходимо - как вы указали - вычесть среднее значение расстояний, прежде чем оценивать среднее квадратическое значение root, потому что стандартное отклонение - это не средний квадрат root самих расстояний, а вместо этого root средний квадрат отклонения от среднего. Это не то, что вы рассчитали.

Что из этого более подходящее, будет зависеть от того, что вы пытаетесь измерить. Предположим, например, что все ваши оценки находятся на одинаковом (ненулевом) расстоянии от контрольной точки. root средний квадрат этих расстояний будет равен этому значению. Но стандартное отклонение расстояний будет равна нулю, потому что это мера разброса в переменной касается, и все значения (расстояние от опорной точки) равны.

Если вы пытаетесь оценить точность измерений, то среднее квадратическое расстояние root (а не стандартное отклонение), вероятно, имеет большее значение.

0 голосов
/ 17 июня 2020

Две вещи: 1) Если вы уже вычисления расстояния между опорной точкой и точкой наблюдения в distanceBetweenTwoPoints [23] D (), вы не хотите использовать контрольную точку как среднее. Это уже как бы заложено в расчет.

2) math.stdev () вычислит стандартное отклонение за вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...