Надеюсь, название не слишком сбивает с толку, но это лучшее, что я мог придумать (не стесняйтесь предлагать лучшие названия!)
У меня есть физический датчик, расположенный в фиксированном месте в комнате, скажем (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")
Кто-нибудь может доказать, что я прав или неправильно?
С уважением