#c #linear-regression #curve-fitting #itk #gamma-distribution
Вопрос:
У меня есть массив значений (значений концентрации), каждое из которых взято в другой момент времени. Мне нужно подогнать кривую гамма-вариации (формула приведена на рисунке ниже) к этим значениям (т. Е. Найти альфа и бета таким образом, чтобы кривая наилучшим образом соответствовала этим точкам — все остальные переменные известны).
пример значений, которые я мог бы получить (крестики), и кривая, которую я хотел бы подогнать:
Я понятия не имею, как это сделать. Я попытался подогнать упрощенную версию формулы, которую можно решить с помощью линейной регрессии, с помощью матриц, но я не смог заставить ее работать. Эта версия формулы (в которой вы решаете только для одной переменной, альфа) выглядит следующим образом:
упрощенная версия, которая также была бы прекрасна:
моя попытка решить подгонку кривой линейной регрессии с использованием матриц, используя библиотеку vnl (https://vxl.github.io/doc/release/core/vnl/html/index.html) выглядело так. Я следовал учебнику этого парня (https://machinelearningmastery.com/solve-linear-regression-using-linear-algebra/)
//this is the "data", m_Timing is a vector containing the time each of the data were taken at.
vectorVoxel = inputVectorVolumeIter.Get();
// linear regression
//declaring the independent (y) and dependent values (x) for our linear regression
vnl_matrix<double> ind_var(timeSize, 1);
vnl_vector<double> dep_var(timeSize);
//this vector will hold the "weights" of the fitted line - although in this case there should only be 1 weight
vnl_vector<double> weights(1);
//loading the values into our independent and dependent variable holders
for (index = 0; index < timeSize; index ) {
ind_var(index, 0) = (1 log(m_Timing[index]/tempTTP) - (m_Timing[index]/tempTTP));
dep_var.put(index, log(vectorVoxel[index]));
}
//fitting the curve!
weights = (ind_var.transpose() * ind_var) * ind_var.transpose() * dep_var;
Это не работает — вектор весов, который должен содержать коэффициент (альфа) подогнанной строки, просто содержит «нуль».
Код, над которым я работаю, использует библиотеку itk (библиотеку для обработки медицинских изображений), и я также использую vnl для матриц. Есть ли какой-нибудь способ сделать это?
Спасибо, что прочитали это! Я действительно ценю любую помощь/даже просто указание мне в правильном направлении, потому что я понятия не имею, как действовать дальше.
Комментарии:
1. Мне нужны ваши данные (числовые, а не графические), чтобы проверить конкретный метод регрессии и посмотреть, удобен ли этот метод в вашем случае.
2. @JJacquelin спасибо, что ответили! данные будут меняться каждый раз при использовании программы (программа генерирует математическую обработку на компьютерной томографии головного мозга, многократно выполняемой в течение примерно минуты, когда пациенту вводят контраст — каждая группа данных на самом деле (измерение плотности) представляет собой один «пиксель» из мозга человека, взятый в разные моменты времени в течение этой минуты. Вот пример данных (преобразованных таким образом, чтобы можно было выполнить регрессию — я не уверен, что это правильно сделано с моей стороны):
3. @JJacquelin зависимая переменная (логарифм плотности в те времена): [3.55, 2.77, 3.13, 3.25, 3.465, 2.89, 3.58, 2.39, 3.46, 3.13, 3.61, 2.9, 2.19, 3.29] независимая переменная (полученная из значений времени): 0.0, -2.1, -1.5, -1.16, 0.0, -0.0035, -0.007, -0.021, -0.038, -0.059, -0.08, -0.1, -0.14
4. Не могу использовать его, потому что в первом файле их 14, а во втором-только 13.
5. Вы написали «Это не работает» в конце своего вопроса. Я хотел бы использовать те же данные, что и вы, в случае, если они не работают, чтобы воспроизвести проблему, с которой вы столкнулись, и посмотреть, в чем именно заключается трудность.
Ответ №1:
Это проблема, которая не лучше всего подходит для решения с помощью ITK. Хотя вы могли бы использовать оптимизирующую инфраструктуру ITK, есть лучшие/более простые варианты.
Может быть, попробовать NLopt? Вот пример того, как его использовать. Кроме того, вы можете посмотреть на этот код, который сопоставляет многочлен с точками в 3D-пространстве.