2

Я получил несколько кривых от разных датчиков, но все они прикреплены к одному движущемуся объекту.Извлечение функции из нескольких кривых

Теперь я хочу извлечь из него функции, скажем, я вырезал 0-10 как window1, поэтому в окне1 я получил 5 графиков, каждый график представляет один датчик в определенном положении, каждый датчик генерирует 3 кривые, x (красный), у (зеленый) и г (синий), как показано ниже:

Entire graph is a single window ** Весь граф представляет собой одно окно

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

Сколько разумных функций я мог бы создать из этого единственного окна?

Я так ценю любые советы .. Спасибо!

+0

Что такое "cut 0-10", это относится ко времени? Эти кривые или положения скорости? Какова ваша общая задача с этими данными? – cfh

+0

Да, 0-10 находится в секундах, и они являются показаниями акселерометра, общая задача - обнаружение движения. В то же время я получил все данные угла Эйлера. – Yank

+0

Так что, в основном, все эти показания описывают одно и то же движение только в разных системах координат? Звучит как работа для ортогональной задачи Прокруста. – cfh

ответ

2

Вы можете преобразовать разные временные ряды в одну и ту же систему координат, решая orthogonal Procrustes problem.

Вот пяти массивов из углов Эйлера, которые вы мне дали (они хранятся в arr[0] через arr[4] как 169x3 Numpy массивы):

plots before

Теперь мы решаем ортогональную задачу Procrustes по следующей Python рутина, которая позволяет вращать один из массивов, чтобы соответствовать другой настолько близко, насколько это возможно:

def rotate_into(arr0, arr1): 
    """Solve orthogonal Procrustes problem""" 
    M = dot(arr0.T, arr1) 
    (U,S,V) = svd(M) 
    Q = dot(U, V) # the rotation matrix which transforms arr0 into arr1 
    return arr0.dot(Q) 

svd является сингулярным значением деко mposition и живет в numpy.linalg.svd. Теперь мы можем применить эту процедуру для каждого массива и преобразовать его, чтобы быть как можно ближе к опорному массива, то здесь первое одно:

reference = 0 

for i in range(0,5): 
    subplot(2,3, i+1) 
    plot(rotate_into(arr[i], arr[reference])) 

plots after

Теперь все серии сопоставимы, и вы можете легко вычислять функции из них, принимая среднее значение, стандартное отклонение и т. д.

+0

cfh, вы гений и большое спасибо за глубокий рыть в мой вопрос. Я считаю, что вы правы, но все же несколько моментов, которые я не понимаю: во-первых, ортогональный Procrustes, который меняет оригинальные физические свойства? Потому что результат был преобразован, кажется, все изменилось. во-вторых, почему он подходит для системы, содержащей многокоординатные системы? В-третьих: потому что я сравниваю это окно с другим, должен ли я вычислять полное среднее или стандартное отклонение, добавляя каждую кривую, которую я имею? – Yank

+0

@Yank: на вашем устройстве все датчики имеют разную физическую ориентацию. Решение проблемы Procrustes пытается найти для каждого датчика матрицу поворота 'Q', так что, когда данные датчика вращаются им, она как можно ближе к опорным данным, что в моем примере было просто первым датчиком. Эффект подобен тому, как если бы все датчики движения в вашем устройстве были установлены с одинаковой ориентацией в первую очередь. – cfh

+0

@Yank: Я должен упомянуть, что если вы хотите сравнить разные окна, может быть лучше всего вычислить для каждого датчика правильную матрицу вращения 'Q' один раз заблаговременно и не менять ее на окно. Если вы хотите, теперь вы можете просто усреднить все 5 датчиков вместе, чтобы получить функции, или вы можете держать датчики отдельно, если это важно для ваших данных. – cfh