Солвер, чтобы соответствовать 2Д распределение Гаусса
Привет,
Я использую C# и решатель, чтобы соответствовать 2D-Гауссу. Используя смоделированные данные (без шума) с различными сигмами, интенсивностями и центром, он работал идеально. Однако с реальными данными он работает только около 50% времени, хотя все тестовые данные представляют собой изображения примерно одинакового качества и приблизительно одинаковые Сигмы для обоих x и y. могу ли я отправить код, чтобы кто-то, у кого больше опыта, мог увидеть, что я сделал неправильно.
Изображения имеют размер около 100x100 с разрешением 5 мм и сигмами около 7 мм как для x, так и для Y.
Когда это не удалось, он потерпел неудачу со значениями сигм и интенсивности, близкими к 0.0.
Это такая простая проблема, я не думаю, что решатель не может справиться с ней, и данные совсем не так шумны. Это должно быть что-то тонкое, что я не построил модель должным образом.
Я был бы очень признателен, если бы кто-нибудь мог помочь.
Спасибо,
Даниил
Вот основной код
var solver = SolverContext.GetContext(); solver.ClearModel(); var model = solver.CreateModel(); var decisionsA = Spot_Params.Spot_ParamsA.Select( it => new Decision(Domain.RealNonnegative, it.Key)); model.AddDecisions(decisionsA.ToArray()); var decisionsB = Spot_Params.Spot_ParamsB.Select( it => new Decision(Domain.Real, it.Key)); model.AddDecisions(decisionsB.ToArray()); var objective = new SumTermBuilder(gaussMatrix.Data_1D.Count()); var sx = model.Decisions.ElementAt(0); var sy = model.Decisions.ElementAt(1); var sf = model.Decisions.ElementAt(2); var cx = model.Decisions.ElementAt(3); var cy = model.Decisions.ElementAt(4); var sx_sq_2_inv = 1.0 / (sx * sx * 2.0); var sy_sq_2_inv = 1.0 / (sy * sy * 2.0); int n = 0; for (int j = 0; j < gaussMatrix.Nrow; j++) { var dy = gaussMatrix.Ypos[j] - cy; for (int i = 0; i < gaussMatrix.Ncol; i++) { var dx = gaussMatrix.Xpos[i] - cx; var v = (dx * dx) * sx_sq_2_inv + (dy * dy) * sy_sq_2_inv; var value = sf * Model.Exp(-v); var diff = gaussMatrix.Data_1D[n++] - value; objective.Add(diff * diff); } } model.AddGoal("OptimizedSpotParams", GoalKind.Minimize, objective.ToTerm()); // Extract fitted parameters var spot_params = fittedParams.Spot_Params; Solution solution; solution = await Task.Run(() => solver.Solve());
Что я уже пробовал:
Просмотр кода и входных данных. Не видел ничего явно неправильного