Лучший способ масштабирования матричных переменных в схеме линейного программирования SCIPY

У меня есть следующая схема оптимизации, реализованная в NNLS в scipy .

import numpy as np from scipy.optimize import nnls from scipy import stats #Define problem A = np.array([[60., 90., 120.], [30., 120., 90.]]) b = np.array([6700.5, 699.,]) # Add ones to ensure the solution sums to 1 b = np.hstack([b,1.0]) A = np.vstack([A,np.ones(3)]) x, rnorm = nnls(A,b) print x # the solution is # [ 93.97933792 0. 0. ] # we expect it to sum to 1 if it's not skewed 

Как вы можете видеть, вектор b намного выше значений в A Мой вопрос – это лучший / разумный способ масштабирования A и b чтобы решение не искажалось.

Обратите внимание, что как A и b представляют собой исходные данные экспрессии генов без предварительной обработки.

One Solution collect form web for “Лучший способ масштабирования матричных переменных в схеме линейного программирования SCIPY”

Если вы хотите включить ограничение равенства, вы не можете использовать программу nnls, поскольку она не удовлетворяет равенствам. Если вы ограничены тем, что предлагается в scipy, вы можете использовать это:

 import numpy as np from scipy.optimize import minimize #Define problem A = np.array([[60., 90., 120.], [30., 120., 90.]]) b = np.array([6700.5, 699.,]) #----------------------------- # I tried rescaling the data by adding this two lines, # so that they're in same scale. # but why the solution is different? # x: array([ 1., 0., 0.]) # What's the correct way to go? #----------------------------- # A = A/np.linalg.norm(A,axis=0) # b = b/np.linalg.norm(b) def f(x): return np.linalg.norm(A.dot(x) - b) cons ={'type': 'eq', 'fun': lambda x: sum(x) - 1} x0 = [1, 0, 0] # initial guess minimize(f, x0, method='SLSQP', bounds=((0, np.inf),)*3, constraints=cons) 

Вывод:

  status: 0 success: True njev: 2 nfev: 10 fun: 6608.620222860367 x: array([ 0., 0., 1.]) message: 'Optimization terminated successfully.' jac: array([ -62.50927734, -100.675354 , -127.78314209, 0. ]) nit: 2 

Это минимизирует объективную функцию напрямую, а также создает ограничение на равенство, которое вас интересует.

Если скорость важна, вы можете добавить информацию о jacobian и hessian или, что еще лучше, использовать правильный решатель QP, предоставленный cvxopt .

  • Как заставить scipy.interpolate дать экстраполированный результат за пределами диапазона ввода?
  • Как создать матричный массив Matlab из scipy.io?
  • найти расстояние между точкой и кривой python
  • Нарезка скудной разреженной матрицы с использованием булевой маски
  • создание wav-файла и запись его на диск с использованием scipy
  • Общие библиотеки Python: RTLD_GLOBAL segfault
  • Расчет ранжирования в процентах
  • Альтернативы python griddata
  • Эффективно накапливается коллекция редких scipy-матриц
  • Эффективный расчет расстояния между N точками и ссылкой в ​​numpy / scipy
  • Фильтрация сигнала с помощью Python lfilter
  • Python - лучший язык программирования в мире.