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

Тема в разделе "Как сделать...", создана пользователем zonr, 13 ноя 2014.

  1. zonr

    zonr -=^.^=-

    Регистр.:
    10 фев 2010
    Сообщения:
    290
    Симпатии:
    287
    Итак, есть определённый массив данных, на основании которого формируется график (где находится массив, на данный момент пока что не сильно важно, ну пусть будет MySQL или предлагайте варианты).

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

    Графики.PNG

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

    Графики2.PNG

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

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

    Как при помощи PHP вычислить на основании графика или данных графика точку перелома?
     
  2. smiler

    smiler

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

    P.S. Подправил логику :)
     
  3. zonr

    zonr -=^.^=-

    Регистр.:
    10 фев 2010
    Сообщения:
    290
    Симпатии:
    287
    Дело в том, что линия необязательно становится прямой... Если бы она стала прямой, проблемы вообще не было бы. )) Тогда действительно сравнение данных за последние несколько отрезков на равенство и всё. )) А тут суть заключается в том, что последние изменения очень незначительны по сравнению с начальными. Могут быть и равны, но необязательно.
     
  4. smiler

    smiler

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

    Andy_ham Джедай на пенсии

    Регистр.:
    3 сен 2007
    Сообщения:
    450
    Симпатии:
    264
    Тогда скорее всего как написал smiler, но с такой поправкой - брать отрезок в 5 элементов и вычислять его среднеарифметическое значение. Как только соседние отрезки будут различаться на некий минимальный порог - это и есть искомая точка перелома.

    smiler еще одну идею раньше меня написал :)
     
    zonr нравится это.
  6. smiler

    smiler

    Регистр.:
    7 ноя 2006
    Сообщения:
    427
    Симпатии:
    422
    Кстати, число "5" я взял "на шару". Это число можно увеличивать или уменьшать, в зависимости от того, какую цель ты преследуешь, так сказать :) Чем оно выше, тем больше точность определения "равнины", но времени больше пройдёт и Зонр может пропустить падение курса битка или гривны ;)
     
  7. Andy_ham

    Andy_ham Джедай на пенсии

    Регистр.:
    3 сен 2007
    Сообщения:
    450
    Симпатии:
    264
    Все зависит от скорости появления этих самых значений и необходимой скорости и точности вычислений, а так можно и по 2-м значениям вычислять :). Меня больше волнует вопрос - насколько жизнеспособна спонтанная мысль про среднеарифметические значения, вроде как вполне реально и просто?
     
  8. smiler

    smiler

    Регистр.:
    7 ноя 2006
    Сообщения:
    427
    Симпатии:
    422
    Дело в том, что придется потом КАЖДЫЙ элемент выборки сравнивать с этим среднеарифметическим и определять еще кучу переменных/массивов и пр. :) Это как померять среднюю температуру по больнице (с моргом включительно :) ) и пытаться понять, кто из больных уже "закипает", а на кого уже белые тапочки заказывать :)
     
    zonr нравится это.
  9. zonr

    zonr -=^.^=-

    Регистр.:
    10 фев 2010
    Сообщения:
    290
    Симпатии:
    287
    Хорошо, а как можно выразить размер минимального порога НЕ в конкретных статичных единицах? А в процентах, например.

    Да это понятно, что "5" - для примера. )) Хватит и двух. Наверное.
     
  10. metsys

    metsys

    Регистр.:
    27 апр 2014
    Сообщения:
    423
    Симпатии:
    408
    если правильно понял, необходимо нормировать накопленные данные и выставить порог, где идет останов (если не останов, а чего там - метко или еще чего... не суть важно)
    Для нормирования данных необходимо найти максимальное значение в массиве и разделить все элементы на него.
    Только в таком случае можно выставлять проценты.

    Отправная точка для более широкого понимания http://www.basegroup.ru/glossary/definitions/normal_linear/
     
    Последнее редактирование: 13 ноя 2014