Я думал, что наименьший квадрат может быть решением, поскольку он имеет следующее утверждение в описании:
Код: Выделить всё
x = arg min(sum(func(y)**2,axis=0))
y
Я особенно ищу хотя бы квадратичную оптимизацию. , поскольку в будущем я хотел бы предоставить несколько изображений, которые должны генерироваться одним и тем же параметром w (с другими аргументами).
Есть ли какие-нибудь библиотеки, кроме scipy, которые могли бы обеспечить более элегантный подход к этой проблеме?
Я также планировал попробовать numba-реализацию корневой функции, но у нее есть свои проблемы. Или использовать реализацию LM на основе JAX от Google, но у меня пока нет реального опыта работы с JAX...
EDIT 1
Вот небольшой пример моей проблемы:
Допустим, у меня есть модель, определенная как f(n) = a*n**2 + b*n + c, где f(n) — это значение изображения на пиксель n. Для разных троек (a,b,c) я могу генерировать изображения I=f(n). Теперь у меня есть набор изображений I1, I2,... с разными параметрами (a1, b1, c1), (a2, b2, c2),..., но n< /code> не различается по пикселям в каждом пикселе.
Самый простой случай — одно изображение I1 и параметры (a1, b1, c1), а необходимое n можно вычислить с помощью метода корней или минимизатора:
Код: Выделить всё
def my_model(n, a, b, c, img=0):
return a * n**2 + b * n + c - img
# load img1, a1, b1, c1 from a file
n = np.zeros_like(img1)
for i in range img1.shape[0]:
for j in range img1.shape[1]:
x0 = 1/3
args = {
"a": a1,
"b": b1,
"c": c1,
"img": img1[i,j],
}
res = least_squares(my_model, x0, kwargs=args)
n[i, j] = res.x[0]
code>.
Если бы я мог сделать это быстрее, реализовать несколько изображений тоже было бы не так сложно, поскольку мне нужно только предоставить массив параметров.РЕДАКТИРОВАТЬ 2
Я снова проверил свою функцию деривации и, кажется, у меня была ошибка, но сейчас она исправлена (я тестировал ее на данных из Matlab). Я реализовал дополнительный флаг в исходной функции и обертке:
Код: Выделить всё
def my_model(n, a, b, c, img=0, derivative=False):
if derivative:
return 2 * a * n + b
return a * n**2 + b * n + c - img
def my_model_derivative(n, a, b, c):
return my_model(n, a, b, c, derivative=True)
# load img1, a1, b1, c1 from a file
n = np.zeros_like(img1)
for i in range img1.shape[0]:
for j in range img1.shape[1]:
x0 = 1/3
args = {
"a": a1,
"b": b1,
"c": c1,
"img": img1[i,j],
}
res = least_squares(my_model, x0, my_model_derivative, kwargs=args)
n[i, j] = res.x[0]
После устранения проблемы производительность снизилась. не сильно улучшилось, если вообще улучшилось. Я думаю, что самым узким местом является цикл над изображением.
Подробнее здесь: https://stackoverflow.com/questions/787 ... -in-python