LINUX.ORG.RU

Поиск точки изгиба в одномерном массиве

 , , ,


3

1

Есть шумная кривая, описывающая синаптический ток:

http://i.stack.imgur.com/RyH5g.png

В ней три фазы: покой, нарастание и спад. Нужно найти точку начала фазы нарастания (помечена красным). Куда копать? Если бы не шум, это была бы тупо точка отклонения от прямой, а так я в растерянности...

★★★★★

А что если усреднить значения за некоторый период и на основе этого определять отклонения от средней?

Siado ★★★★★
()

Или разность сумм интервалов рассматривать. Главное, «правильную» разность выбрать (можно хоть квадратичную брать).

maverik ★★
()

Можно попробовать еще не среднее, а медиану. Еще возможно стоит применить фильтрацию по частотам, если не хватит усреднения? Шум наверно высокочастотный, соответственно именно такой фильтр и применить может быть имеет смысл?

pylin ★★★★★
()
Ответ на: комментарий от nanoolinux

От чего? Нужна аппроксимация, чтобы ее брать.

maverik ★★
()

Ищем локальный минимум , от него идём «назад» по массиву ищем пики. Если слудющий за найденым пиком меньше/ниже/в_пределах_погрешности - предыдущий пик нужная фаза. Пойдёт?

anonymous
()
Ответ на: комментарий от Siado

Плохо подходит для шумных данных. Мне может понадобиться работать с шумом на пару порядков больше.

Axon ★★★★★
() автор топика
Ответ на: комментарий от anatoly

Сгладить можно. Например, с помощью вейвлетов. Или медианным фильтром.

А форма не поползёт? Мне очень важна кинетика спада и нарастания, этим жертвовать нельзя. И что дальше делать со сглаженной кривой?

Axon ★★★★★
() автор топика
Ответ на: комментарий от pylin

Шум наверно высокочастотный, соответственно именно такой фильтр и применить может быть имеет смысл?

Фильтр уже применён, больше нельзя. Кинетика процесса исказится.

Axon ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Не понял как это поможет найти саму точку перегиба.

Axon ★★★★★
() автор топика
Ответ на: комментарий от Axon

Форма может поползти глобально, если многократно чистить данные, а, если не применять многократно, то сильно форма поплыть не должна.

pylin ★★★★★
()
Ответ на: комментарий от pylin

Форма может поползти глобально, если многократно чистить данные, а, если не применять многократно, то сильно форма поплыть не должна.

Ну, я пробовал вейвлет-преобразование со сглаживанием, получалась фигня. Оно мне ещё и линейный участок гнуло.

Axon ★★★★★
() автор топика
Ответ на: комментарий от Axon

А форма не поползёт?

Не должна. По крайней мере медианную фильтрацию можно быстро проверить. http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.medfilt.html... Вйвлеты я бы тоже проверил. Подобную как на картинке шумовую ВЧ-составляющую они хорошо убирают.

И что дальше делать со сглаженной кривой?

То же самое что и раньше собирался делать:

Если бы не шум, это была бы тупо точка отклонения от прямой

anatoly ★
()

Нужно найти точку начала фазы нарастания (помечена красным). Куда копать? Если бы не шум, это была бы тупо точка отклонения от прямой, а так я в растерянности...

а ты лучше попробуй решить без шума. К примеру для функции exp(x), в каком месте она отходит от x==0?

emulek ★
()
Ответ на: комментарий от emulek

прочитал топик, вы вообще в школе учились, люди? Откуда вы такие берётесь? Эта «точка изгиба» ищется исключительно эмпирическим путём. Например по закону 95%, или правилу 80/20.

emulek ★
()
Ответ на: комментарий от dimderbin

А, точка == отклонению от ~диапазона шума, не?

ещё один. Как ты определяешь «диапазон шума»? Что это вообще такое? Почему шум в половину графика не может выплеснуть раз в году?

emulek ★
()
Ответ на: комментарий от anatoly

По крайней мере медианную фильтрацию можно быстро проверить.

Не катит.

Вйвлеты я бы тоже проверил.

Кривую неплохо описывают, но линейный участок гнут.

Axon ★★★★★
() автор топика
Ответ на: комментарий от dimderbin

А, точка == отклонению от ~диапазона шума, не?

Не.

Axon ★★★★★
() автор топика
Ответ на: комментарий от emulek

Эта «точка изгиба» ищется исключительно эмпирическим путём.

И что, это никак не формализовать? Нутром чую, что можно.

Axon ★★★★★
() автор топика
Ответ на: комментарий от greenman

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

Axon ★★★★★
() автор топика
Ответ на: комментарий от Axon

Уже сто лет как формализовано, см ссылку. Почему не катит линейный фронт с экспоненциальным спадом? У вас там синапс инопланетный?

ebantrop ★
()
Ответ на: комментарий от emulek

Эко тебя бомбануло то. Пойди выпей яду узбагоительного.

nanoolinux ★★★★
()
Ответ на: комментарий от Axon

И что, это никак не формализовать? Нутром чую, что можно.

НЕТ!

вот например в электротехнике считают, что в RC цепи стационарное состояние наступает за время 3τ (несложно посчитать, что напряжение на конденсаторе будет в этот момент 95%). Другими словами, через 3τ «начинается прямая».

emulek ★
()
Ответ на: комментарий от ebantrop

Уже сто лет как формализовано, см ссылку.

Поиск точки изгиба в одномерном массиве (комментарий)

Почему не катит линейный фронт с экспоненциальным спадом?

По факту на записи он не линейный. Есть дендритная фильтрация, есть недокомпенсированные ёмкости, и в итоге райз сглаживается.

Axon ★★★★★
() автор топика
Ответ на: комментарий от emulek

вот например в электротехнике считают, что в RC цепи стационарное состояние наступает за время 3τ (несложно посчитать, что напряжение на конденсаторе будет в этот момент 95%). Другими словами, через 3τ «начинается прямая».

Мне так будет норм. Всё равно шум искажения вносит.

Axon ★★★★★
() автор топика
Ответ на: комментарий от Axon

в твоей задаче нужно сначала убрать высокочастотный шум любым фильтром. А потом искать твою «точку изгиба» эмпирически, например как только производная будет больше 0.05(т.е. её наклон).

emulek ★
()
Ответ на: комментарий от emulek

в твоей задаче нужно сначала убрать высокочастотный шум любым фильтром.

Совсем убрать не выйдет. На рисунке усреднённая кривая для почти тысячи событий. Если их, скажем, 300, то шум гораздо заметнее. А представьте как выглядит каждое из них по одиночке?

А потом искать твою «точку изгиба» эмпирически, например как только производная будет больше 0.05(т.е. её наклон).

Производная чего именно?

Axon ★★★★★
() автор топика
Последнее исправление: Axon (всего исправлений: 1)
Ответ на: комментарий от Axon

Мне так будет норм. Всё равно шум искажения вносит.

считай наклон первой производной |Δx/Δy|. Н не для одной точки, а для пяти точек, две слева, и две справа. Результат усредни. Как только наклон будет больше 0.1, то «прямая кончилась». Ну или 0.05, зависит от задачи.

emulek ★
()
Ответ на: комментарий от Axon

Совсем убрать не выйдет. На рисунке усреднённая кривая для почти тысячи событий. Если их, скажем, 300, то шум гораздо заметнее. А представьте как выглядит каждое из них по одиночке?

а по одиночке ты ничего вообще не сделаешь. В принципе. Даже глазками.

Производная чего именно?

как чего? Функции, которая у тебя задана таблицей. Я там говорил «пять точек», это на самом деле не 5 точек, а дистанция, которая покрывает типичный горб шума. Т.е. если у тебя горбики 30..120 точек обычно, то «5 точек» это где-то так 50 точек ((120-30)/2).

emulek ★
()
Ответ на: комментарий от Axon
#!/usr/bin/python

import urllib2
import numpy as np
import matplotlib.pyplot as plt

response = urllib2.urlopen('http://dpaste.com/1780510/plain/')

X1,Y1 = [],[]
for l in response.read().split('\n'):
  [x,y] = [float(v) for v in l.split(',')]
  X1.append(x)
  Y1.append(y)

X2,Y2 = [],[]
n,k=len(X1),5
for i in xrange(n-k):
  X2.append((X1[i]+X1[i+k])/2)
  Y2.append((Y1[i]-Y1[i+k])/2)

for i in xrange(n-k):
  if Y2[i]>0.5:
    X3,Y3 = X1[i],Y1[i]
    break

line, = plt.plot(X1, Y1, '-')
line, = plt.plot(X2, Y2, '-')
line, = plt.plot(X3, Y3, 'o')

plt.show()
anonymous
()
Ответ на: комментарий от Axon

Ну это нехорошая идея как я думаю, но, если попробовать: у линейного участка графика дисперсия наверно будет значительно отличаться от зашумленного, следовательно сначала пройти по графику и определить, где происходит смена дисперсии. Зафиксировать точку смены и применять сглаживания только на сильно зашумленных участках.

pylin ★★★★★
()
Ответ на: комментарий от Axon

буква Δ означает «разность». Если есть две точки t0 и t2, то производная в точке t1 (посередине) равна |(x0-x2)/(y0-y2)|. Конечно это не совсем производная, а некое её значение, с неплохой точностью, если точки недалеко по сравнению с шумом.

emulek ★
()
Ответ на: комментарий от emulek

а по одиночке ты ничего вообще не сделаешь. В принципе. Даже глазками.

Спад уже фиттить приходилось, ошибки, конечно, приличные, но, если делать оверсемплинг, то на большом числе событий распредение выглядит вполне прилично.

как чего? Функции, которая у тебя задана таблицей.

А я её знаю?

Axon ★★★★★
() автор топика
Ответ на: комментарий от pylin

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

если ТС складывал по 1000 замеров, то дисперсия на всех участках будет одинакова.

Хотя... Неплохо-бы узнать, ОТКУДА этот шум берётся, его физическую природу?

emulek ★
()
Ответ на: комментарий от Axon

как чего? Функции, которая у тебя задана таблицей.

Ну массив, по которому строился график, и есть таблично заданная функция :) Хотя как тут выше заметили с шумом брать производную плохая идея

pylin ★★★★★
()
Последнее исправление: pylin (всего исправлений: 1)
Ответ на: комментарий от Axon

а по одиночке ты ничего вообще не сделаешь. В принципе. Даже глазками.

Спад уже фиттить приходилось, ошибки, конечно, приличные, но, если делать оверсемплинг, то на большом числе событий распредение выглядит вполне прилично.

а что за картинка в первом посте? Это усреднённое из 1000?

как чего? Функции, которая у тебя задана таблицей.

А я её знаю?

ох... У тебя таблица есть, или только картинка?

emulek ★
()
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.