У меня есть набор значений XY (т. е. точечная диаграмма), и я хочу, чтобы подпрограмма Pascal генерировала коэффициенты полинома N-го порядка, который соответствует этим точкам, так же, как это делает Excel.
Где я могу получить реализацию Delphi/Pascal для подбора кривой полиномиальной регрессии в стиле Excel?
Ответы (5)
Я использовал пример Polyfit Дэвида Дж. Тейлора (curvefit.zip), который реализует алгоритм подбора кривой методом наименьших квадратов (также известный как линейная регрессия). Сайт Дэвида: здесь, но продолжайте читать, потому что моя версия лучше. (Смотри ниже).
Источником алгоритмов, которые использует Дэвид, является книга по научной математике для программистов на Паскале, подпрограмма подгонки кривых Аллена Миллера из книги «Программы на Паскале для ученых и инженеров», напечатанная и представленная в MTPUG в октябре 1982 года Юргеном Левнером и исправленная. и адаптирован для Turbo Pascal Джеффом Вайсом.
Вы можете скачать файл curvefit.zip прямо из Bitbucket здесь. (Вы можете клонировать исходный код с помощью Mercurial/TortoiseHG или загрузить ZIP-файл с битбакета)
hg clone https://bitbucket.org/wpostma/curvefit curvefit
Он работает в любой версии Delphi 5 и выше, Unicode или нет, даже в Delphi 10 Berlin. В демо есть небольшая диаграмма, добавленная мной. Я также добавил способ форсировать результат через начало координат, распространенный метод, когда вы хотите получить наилучшее соответствие для всех значений, кроме постоянного члена, который должен быть принудительно установлен либо равным нулю, либо некоторому экспериментально полученному среднему значению. Принудительное «холостое вычитание», которое устанавливается равным среднему значению серии аналитических «нулевых проб», распространено в некоторых видах аналитической химии при использовании с определенными типами приборов, а также в других научных случаях, где оно может быть более полезно, чем наилучшее соответствие, потому что вам может потребоваться минимизировать ошибку вокруг начала координат больше, чем минимизировать ошибку в области кривой, наиболее удаленной от начала координат.
Я также должен уточнить, что для целей линейной регрессии «кривая» может также быть линией, что мне и нужно для целей аналитической химии, и что уравнение для любой прямой линии (y=mx+b) также называется уравнением «калибровочная кривая». Подгонка кривой первого порядка представляет собой линию (y = mx +b), подгонка кривой второго порядка (показана на рисунке) представляет собой параболу (y = nX^2 + mX + b). Как вы можете догадаться, этот алгоритм масштабируется от первого порядка до любого уровня, который вы пожелаете. Однако я не тестировал его выше 8 терминов.
Вот скриншот:
Ссылка на проект Bitbucket:
https://bitbucket.org/wpostma/curvefit/overview
Попробуйте TPMath http://tpmath.sourceforge.net/ — я годами использую его для холм регрессии и могу рекомендовать его.
Проверьте функции в библиотеке SysTools от Turbo Power, теперь она с открытым исходным кодом, включает математические функции в модуле StStat. .
Несмотря на то, что вы уже дали ответ, для полноты картины я решил добавить это:
Мы используем математический пакет SDL Components и очень им довольны.
http://www.lohninger.com/delfcomp.html
Он хорошо продуман и делает именно то, что нам нужно.
На его сайте есть множество других интересных инструментов.
XlXtrFun — это лучшая аппроксимация кривой, которую я знаю и использую, но она предназначена для Excel:
http://www.xlxtrfun.com/XlXtrFun/XlXtrFun.htm