У мене є дані форми . Для оцінки від до я використовую формули цієї статті: Джон Фокс - нелінійна регресія та нелінійні найменші квадрати У цій роботі оцінюється , переглядаючи дані. Якщо я це зробити, це працює добре, навіть якщо у мене є лише три бали. З цього можу обчислити два інших. Я перевірив свої параметри за допомогою nls () в R та LevenbergMarquardt в C #. Повернені ними моделі задовольняють. β1β3β1
Проблема в тому, що я не хочу дивитись на дані, щоб отримати хороший оцінювач , я хочу, щоб моя програма обчислила їх. Деякий час я використовував значення, які були трохи вище максимуму моїх значень (щось середнє від та \ max * 1.5 . Це спрацювало нормально, доки точки охоплювали більшу частину функції. Це також справно працювало, якщо Точки даних були десь із "вершини" кривої, але коли всі вони прийшли з області "нижче" точки перегину, цей оцінювач, безумовно, був нижчим, ніж повинен бути, і я не міг відповідати моделі. Якщо я буду використовувати щось що, безумовно, перевищує максимальну точку (помноживши її на смішно високі значення), модель не підходить корисним чином.max ∗ 1,5
Вимірювання може виглядати так:
x = (40, 50, 60, 70), y = (1000, 950, 400, 200) -> легко оцінити
x = (40, 50, 60, 70), y = (1000, 950, 800, 100) -> легко оцінити
x = (40, 50, 60, 70), y = (500, 200, 100, 50) -> не так просто оцінити
Я здогадуюсь, я міг би дізнатися, де я перебуваю у функції ("знизу", "вгорі", на схилі), обчисливши дельти в заданих точках і обчисливши верхню межу залежно від цього. Хтось має підказку для кращого рішення? Додаткова інформація: Якщо цього неможливо зробити, для мене важливіше, щоб виміри, які можуть відповідати, були максимально хорошими, і я погоджуюсь, що деякі вимірювання взагалі не можуть бути придатними.
(хоча я хочу впровадження в C #, я розмістив його тут, я не думаю, що проблема залежить від мови)
оновлення (застосування цього):
x - значення температури і у відповідних вимірювань. За своєю природою дається, що вона повинна виглядати як логістична крива з більш високими значеннями y при нижчих температурах і навпаки. Температура плавлення дорівнює точці перегину кривої, яка сильно змінюється при невеликих змінах параметрів моделі.
оновлення (деякі склали дані з 7 точок даних та відомою точкою перегину у 60):
//first I made up some data without any noise and enough (13) points
double[] x17 = { 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90 };
double[] y17 = { 2000, 1920, 1820, 1700, 1500, 1280, 1000, 720, 500, 300, 180, 80, 0 };
//calculated inflection point: 59.642....
//Then I took three different parts of that data
(to simulate how much data I will have in the real world)
double[] x18 = { 30, 35, 40, 45, 50, 55, 60 };
double[] y18 = { 2000, 1920, 1820, 1700, 1500, 1280, 1000 };
//calculated inflection point: 59.263.... is ok!
double[] x19 = { 60, 65, 70, 75, 80, 85, 90 };
double[] y19 = { 1000, 720, 500, 300, 180, 80, 0 };
//calculated inflection point: 53.447.... to small!
double[] x20 = { 45, 50, 55, 60, 65, 70, 75 };
double[] y20 = { 1700, 1500, 1280, 1000, 720, 500, 300 };
//calculated inflection point: 59.868... almost perfect!
Мій поточний підхід до оцінки верхньої межі - y0 * y0 / y1. Таким чином я сподіваюся врахувати, що я не завжди можу мати значення, близьке до максимального.
оновлення: значення x і y ніколи не будуть від'ємними. x завжди буде {40, 45, 50, 55, 60, 65, 70}, якщо точка даних не буде втрачена.
оновлення: я зробив багато, багато тестів із імітованими даними, які слід легко встановити (я вибираю точки даних, які були точно на кривій = без шуму), і я бачу, що це працює нормально, якщо тільки перша чи друга точка даних (де x = 40 або x = 45) відсутня. Я думаю, мені доведеться відмовитися від таких вимірювань, і користувачеві доведеться з цим жити.