подгонка кривой гамма-вариации к набору точек данных в c

#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-пространстве.