масштабирование / сдвиг векторов экспериментальных данных с использованием Mathematica - PullRequest
2 голосов
/ 11 июля 2011

У меня есть несколько векторов экспериментальных данных, которые мне нужно массажировать, например:

{
 {0, 61237, 131895, 194760, 249935},
 {0, 61939, 133775, 197516, 251018},
 {0, 60919, 131391, 194112, 231930},
 {0, 60735, 131015, 193584, 249607},
 {0, 61919, 133631, 197186, 250526}, 
 {0, 61557, 132847, 196143, 258687},
 {0, 61643, 133011, 196516, 249891},
 {0, 62137, 133947, 197848, 251106}
}

Каждый вектор является результатом одного цикла и состоит из пяти чисел, которые являются временами, в которые объект проходит каждый из пяти датчиков. В течение интервала измерения скорость объекта постоянна (интервалы между датчиками различны, поскольку расстояния между датчиками неодинаковы). От одного прогона к следующему расстояние между датчиками остается неизменным, но скорость объекта будет немного отличаться от одного прогона к следующему.

Если бы датчики были идеальными, каждый вектор должен был быть просто скалярным кратным любого другого вектора (пропорционально отношению их скоростей). Но на самом деле каждый датчик будет иметь некоторый «джиттер» и срабатывать рано или поздно на какое-то небольшое случайное количество. Я пытаюсь проанализировать, насколько хороши сами датчики, т. Е. Сколько "дрожания" в измерениях, которые они мне дают?

Так что я думаю, что мне нужно сделать следующее. К каждому вектору я должен масштабировать его, а затем добавить, а затем немного сместить вектор (добавляя или вычитая фиксированное количество для каждого из его пяти элементов). Затем StandardDeviation каждого столбца будет описывать количество «шума» или «дрожания» в этом датчике. Величина, на которую масштабируется каждый вектор, и величина, на которую сдвигается каждый вектор, должна быть выбрана, чтобы минимизировать стандартное отклонение столбцов.

Мне показалось, что Mathematica, вероятно, имеет хороший инструментарий для выполнения этой задачи, на самом деле я думал, что мог бы найти ответ с помощью Standardize[], но, похоже, он ориентирован на обработку списка скаляров, а не списка списки, как у меня (или, по крайней мере, я не могу понять, применить ли это к моему делу здесь).

Так что я ищу некоторые подсказки относительно того, какие библиотечные функции я мог бы использовать для решения этих проблем, или, возможно, подсказку, которая может понадобиться мне для самостоятельного расщепления алгоритма. Возможно, часть моей проблемы в том, что я не могу понять, где искать - вот что у меня есть проблема «обработки сигналов», или проблема манипулирования данными или интеллектуального анализа данных, или проблема минимизации, или, может быть, это относительно стандартная проблема статистическая функция, о которой я раньше просто не слышал?

(В качестве бонуса я хотел бы иметь возможность контролировать функцию взвешивания, используемую для оптимизации этого масштабирования / сдвига; например, в моих данных выше я подозреваю, что у датчика № 5 есть проблемы, поэтому я хотел бы подогнать данные только учитывать масштабирование датчиков 1-4 при масштабировании / сдвиге)

1 Ответ

1 голос
/ 12 июля 2011

Я не могу комментировать сам ваш алгоритм, так как анализ данных - не моя сильная сторона.Тем не менее, насколько я понимаю, вы пытаетесь охарактеризовать временные колебания каждого датчика.Поскольку данные от одного датчика находятся в одном столбце вашей матрицы, я бы предложил перенести их и сопоставить Standardize с каждым набором данных.Другими словами,

dat = (* your data *)
Standardize /@ Transpose[dat]

Чтобы вернуть его в столбчатую форму, Transpose результат.Чтобы исключить последний датчик из этого процесса, просто используйте Part ( [] ) и Span ( ;; )

Standardize /@ Transpose[dat][[ ;; -2 ]]

Или, Most

Standardize /@ Most[Transpose[dat]]

Думая об этом, я думаю, вам будет трудно отделить временной джиттер от изменения скорости.Можете ли вы намеренно изменить скорость?

...