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
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.