Нахождение центра одномерных данных

Скажем, у меня есть данные: 0 (or near 0), 0, 0, ..., 1, 10, 52, 80, 100, 100, 100, 100 (for a while), 90, 45, 5, 0, 0, 0... Я хочу найти индекс (не обязательно целочисленный, мне нужна большая точность) «центра» моего плато данных.

Моей первой мыслью было сделать гауссовскую аппроксимацию, но данные какое-то время довольно плоские в центре. Так что может какой-то квадратный (?) подойдет. Я также рассматривал минимизацию с помощью gsl, но я не знаю, какой самый простой способ сделать это.

Простым способом было бы найти индекс, соответствующий среднему значению, но это дает мне точность только 1. С подгонкой кривой я могу добиться большего успеха.

Примечание: я на C и могу использовать GSL, но общее математическое решение тоже сработает!


person dargaud    schedule 06.11.2020    source источник
comment
Если вы планируете часто использовать эти данные, то, возможно, сначала отсортируйте их. После чего вы можете просто взять элемент с номером n/2 в отсортированном массиве размером n и получить медиану.   -  person Lundin    schedule 06.11.2020
comment
Думаю, недостаточно точно. Но я просто подумал, что могу просто вычислить центр тяжести данных...   -  person dargaud    schedule 06.11.2020
comment
Не могли бы вы определить «центр плато данных», указать требуемую точность и насколько велико плато по отношению к обоим склонам?   -  person meaning-matters    schedule 06.11.2020
comment
0 (or near 0), - Что это значит? Если эти значения являются целыми числами, 0 будет просто 0. Есть ли какой-то другой тип, о котором вы говорите, чтобы получить дополнительную точность?   -  person ryyker    schedule 06.11.2020
comment
Плато «в несколько раз» больше, чем склоны (от 1 до 3 раз). Данные не являются целочисленными, и по ходу измерений всегда присутствует некоторый шум.   -  person dargaud    schedule 06.11.2020
comment
Вы ищете центр тяжести массива? Это самое близкое, что я могу найти к тому, о чем вы просите...   -  person ryyker    schedule 06.11.2020
comment
Центроид - это то же самое, что и центр тяжести, верно? В таком случае я так думаю.   -  person dargaud    schedule 06.11.2020


Ответы (2)


Предлагаемый алгоритм:

  1. При желании отфильтруйте данные: медиана 3, фильтр нижних частот и т. д.

  2. Найти среднее значение: Avg

  3. Найдите средний индекс значений выше Avg: Center_index.

  4. Усредните несколько приведенных выше значений рядом с Center_index.

person chux - Reinstate Monica    schedule 06.11.2020

средневзвешенный центр строки с массивом, аналогичным вашим данным:

int w[] = {0, 0, 0, 1, 10, 52, 80, 100, 100, 100, 100, 90, 45, 5, 0, 0}

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

Поскольку это одномерный массив, позиция выражается с помощью позиции внутри массива, т. е. индекса, и выглядит следующим образом:

weighted mean center = sum(w[i]*i)/sum(w[i])  //for all i

в псевдокоде:

double sum_w=0;//sum of all values (weights)
double prod_wx=0;//product of all corresponding weights and positions
double wmc=0; //weighted mean center
for(int i=0;i<sizeof(w)/sizeof(w[0]);i++)
{
    prod_wx += w[i]*i;
    sum_w += w[i];
}
wmc = prod_wx/sum_w;
person ryyker    schedule 06.11.2020