PHP. Мозговой штурм: как на основании графика (или данных графика) сформировать условие

zonr

-=^.^=-
Регистрация
10 Фев 2010
Сообщения
281
Реакции
289
Итак, есть определённый массив данных, на основании которого формируется график (где находится массив, на данный момент пока что не сильно важно, ну пусть будет MySQL или предлагайте варианты).

Данные графика сначала резко уменьшаются, затем практически не изменяются с течением времени. Не хочется говорить, что именно, но для примера идеально подойдёт ситуация, когда полный человек хочет похудеть - в первый месяц он скидывает много, в следующий - меньше, в каждый из последующих ещё меньше и однажды доходит до точки, когда вес практически или полностью перестаёт изменяться - линия становится похожей на горизонтальную. Вот эту точку перелома мне и нужно найти на графике. )) Или в данных для графика. Просто на графике этот момент хорошо виден визуально. Сорри за качества графика, рисовала на скорую руку в Пеинте. ))

Графики.PNG

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

Графики2.PNG

Проблема ещё заключается в том, что нет привязки к конкретным числам и временнЫм промежуткам - если говорить о похудении, то толстый человек будет худеть на килограммы, худой - на десятые доли килограммов, а мелкие животные - на граммы. При этом для одних исчисление будет в месяцах, для других - в неделях или днях, для кого-то - в годах, но конечный график при этом всё равно будет формироваться похожим - сначала достаточно резкое снижение (относительно резкое, потому что угол наклона может быть разным - все худеют по-разному, гг), затем точка перелома и переход практически в горизонтальную линию. Другими словами вычисления должны быть основаны на коэффициентах или процентах.

Я при этом даже не могу сформулировать запрос для Гугла, чего я, собственно, вообще от него хочу? :crazy:
Есть одна мысль, к чему можно попытаться привязать эти данные, но я пока что промолчу и хочу услышать ваши мнения.

Как при помощи PHP вычислить на основании графика или данных графика точку перелома?
 
Я бы сделал как-то так: брал бы последние 5 строк двумерного массива a[x][y] и сравнивал их между собой попарно: первый со вторым, второй с третьим, третий с четвертым, четвертый с пятым. И, если первый элемент был больше второго, шёл бы дальше (сравнивал бы второй с третьим). Если последующий элемент был больше предыдущего - прерывание сравнения и снова берем новые последние 5 элементов...
А что делать дальше расскажу после перечисления 1.000.000$ на мою картонку из-под планшета :)

P.S. Подправил логику :)
 
Я бы сделал как-то так: брал бы последние 5 столбцов двумерного массива a[x][y] (нас ведь интересует только ось Y) и сравнивал их между собой попарно: первый со вторым, второй с третьим, третий с четвертым, четвертый с пятым. И, если первый элемент был больше второго, шёл бы дальше (сравнивал бы второй с третьим). Если последующий элемент был больше предыдущего - прерывание сравнения и снова берем новые последние 5 элементов...
А что делать дальше расскажу после перечисления 1.000.000$ на мою картонку из-под планшета :)

Дело в том, что линия необязательно становится прямой... Если бы она стала прямой, проблемы вообще не было бы. )) Тогда действительно сравнение данных за последние несколько отрезков на равенство и всё. )) А тут суть заключается в том, что последние изменения очень незначительны по сравнению с начальными. Могут быть и равны, но необязательно.
 
Тогда надо создать функцию, определяющую "дельту". Например, можно отнимать значение последующего элемента от предыдущего и сравнивать абсолютное значение этой разницы с дельтой (больше/меньше). Если эта разница больше дельты, значит, "равнины" нет :)
P.S. Кстати, подумал о чём: задачу можно решить одномерным массивом, а не двумерным. Будет массив a[0]=100,a[1]=55,a[2]=222. Т.е. индекс массива будет осью X, а значения массива будут значениями оси Y для каждой точки :)
 
Тогда скорее всего как написал smiler, но с такой поправкой - брать отрезок в 5 элементов и вычислять его среднеарифметическое значение. Как только соседние отрезки будут различаться на некий минимальный порог - это и есть искомая точка перелома.

smiler еще одну идею раньше меня написал :)
 
  • Нравится
Реакции: zonr
Тогда скорее всего как написал smiler, но с такой поправкой - брать отрезок в 5 элементов
Кстати, число "5" я взял "на шару". Это число можно увеличивать или уменьшать, в зависимости от того, какую цель ты преследуешь, так сказать :) Чем оно выше, тем больше точность определения "равнины", но времени больше пройдёт и Зонр может пропустить падение курса битка или гривны ;)
 
Кстати, число "5" я взял "на шару". Это число можно увеличивать или уменьшать, в зависимости от того, какую цель ты преследуешь, так сказать :) Чем оно выше, тем больше точность определения "равнины", но времени больше пройдёт и Зонр может пропустить падение курса битка или гривны ;)
Все зависит от скорости появления этих самых значений и необходимой скорости и точности вычислений, а так можно и по 2-м значениям вычислять :). Меня больше волнует вопрос - насколько жизнеспособна спонтанная мысль про среднеарифметические значения, вроде как вполне реально и просто?
 
Все зависит от скорости появления этих самых значений и необходимой скорости и точности вычислений, а так можно и по 2-м значениям вычислять :). Меня больше волнует вопрос - насколько жизнеспособна спонтанная мысль про среднеарифметические значения, вроде как вполне реально и просто?
Дело в том, что придется потом КАЖДЫЙ элемент выборки сравнивать с этим среднеарифметическим и определять еще кучу переменных/массивов и пр. :) Это как померять среднюю температуру по больнице (с моргом включительно :) ) и пытаться понять, кто из больных уже "закипает", а на кого уже белые тапочки заказывать :)
 
  • Нравится
Реакции: zonr
Тогда скорее всего как написал smiler, но с такой поправкой - брать отрезок в 5 элементов и вычислять его среднеарифметическое значение. Как только соседние отрезки будут различаться на некий минимальный порог - это и есть искомая точка перелома.

Хорошо, а как можно выразить размер минимального порога НЕ в конкретных статичных единицах? А в процентах, например.

Кстати, число "5" я взял "на шару". Это число можно увеличивать или уменьшать, в зависимости от того, какую цель ты преследуешь, так сказать

Да это понятно, что "5" - для примера. )) Хватит и двух. Наверное.
 
если правильно понял, необходимо нормировать накопленные данные и выставить порог, где идет останов (если не останов, а чего там - метко или еще чего... не суть важно)
Для нормирования данных необходимо найти максимальное значение в массиве и разделить все элементы на него.
Только в таком случае можно выставлять проценты.

Отправная точка для более широкого понимания Для просмотра ссылки Войди или Зарегистрируйся
 
Последнее редактирование:
Назад
Сверху