找到最小化函数的最佳向量
Find optimal vector that minimizes function
我正在尝试找到一个向量,该向量在与矩阵相乘时最小化残差平方和。
我知道 scipy 的优化包(具有最小化功能)。但是,我的代码有一个额外的限制。 w 的所有条目的总和(请参阅下面的函数)必须等于 1,并且 w 的任何条目都不能小于 0。是否有为我执行此操作的程序包? 如果没有,我该怎么做?
尝试最小化 w:
def w_rss(w,x0,x1):
predictions = np.dot(x0,w)
errors = x1 - predictions
rss = np.dot(errors.transpose(),errors).item(0)
return rss
X0 = np.array([[3,4,5,3],
[1,2,2,4],
[6,5,3,7],
[1,0,5,2]])
X1 = np.array([[4],
[2],
[4],
[2]])
W = np.array([[.0],
[.5],
[.5],
[.0]])
print w_rss(W,X0,X1)
到目前为止,这是我循环遍历 w 的可能值的最佳尝试,但它无法正常工作。
def get_w(x0,x1):
J = x0.shape[1]
W0 = np.matrix([[1.0/J]*J]).transpose()
rss0 = w_rss(W0,x0,x1)
loop = range(J)
for i in loop:
W1 = W0
rss1 = rss0
while rss0 == rss1:
den = len(loop)-1
W1[i][0] += 0.01
for j in loop:
if i == j:
continue
W1[j][0] -= 0.01/den
if W1[j][0] <= 0:
loop.remove(j)
rss1 = w_rss(W1,x0,x1)
if rss1 < rss0:
#print W1
W0 = W1
rss0 = rss1
print '--'
print rss0
print W0
return W0,rss0
scipy中的SLSQP代码可以做到这一点。你可以直接使用scipy.optimize.minimize
with method='SLSQP
, or you can use the function fmin_slsqp
。在下面,我使用 fmin_slsqp
.
scipy 求解器通常将 一维 数组传递给 objective 函数,因此为了保持一致,我将更改 W
和 X1
是一维数组,我将编写 objective 函数(现在称为 w_rss1
)以期望一维参数 w
.
w
中所有元素必须在0到1之间的条件使用bounds
参数指定,和必须为1的条件使用[=22]指定=] 参数。约束函数returnsnp.sum(w) - 1
,所以元素之和为1时为0。
代码如下:
import numpy as np
from scipy.optimize import fmin_slsqp
def w_rss1(w, x0, x1):
predictions = np.dot(x0, w)
errors = x1 - predictions
rss = (errors**2).sum()
return rss
def sum1constraint(w, x0, x1):
return np.sum(w) - 1
X0 = np.array([[3,4,5,3],
[1,2,2,4],
[6,5,3,7],
[1,0,5,2]])
X1 = np.array([4, 2, 4, 2])
W = np.array([.0, .5, .5, .0])
result = fmin_slsqp(w_rss1, W, f_eqcons=sum1constraint, bounds=[(0.0, 1.0)]*len(W),
args=(X0, X1), disp=False, full_output=True)
Wopt, fW, its, imode, smode = result
if imode != 0:
print("Optimization failed: " + smode)
else:
print(Wopt)
当我运行这样的时候,输出是
[ 0.05172414 0.55172414 0.39655172 0. ]
我正在尝试找到一个向量,该向量在与矩阵相乘时最小化残差平方和。
我知道 scipy 的优化包(具有最小化功能)。但是,我的代码有一个额外的限制。 w 的所有条目的总和(请参阅下面的函数)必须等于 1,并且 w 的任何条目都不能小于 0。是否有为我执行此操作的程序包? 如果没有,我该怎么做?
尝试最小化 w:
def w_rss(w,x0,x1):
predictions = np.dot(x0,w)
errors = x1 - predictions
rss = np.dot(errors.transpose(),errors).item(0)
return rss
X0 = np.array([[3,4,5,3],
[1,2,2,4],
[6,5,3,7],
[1,0,5,2]])
X1 = np.array([[4],
[2],
[4],
[2]])
W = np.array([[.0],
[.5],
[.5],
[.0]])
print w_rss(W,X0,X1)
到目前为止,这是我循环遍历 w 的可能值的最佳尝试,但它无法正常工作。
def get_w(x0,x1):
J = x0.shape[1]
W0 = np.matrix([[1.0/J]*J]).transpose()
rss0 = w_rss(W0,x0,x1)
loop = range(J)
for i in loop:
W1 = W0
rss1 = rss0
while rss0 == rss1:
den = len(loop)-1
W1[i][0] += 0.01
for j in loop:
if i == j:
continue
W1[j][0] -= 0.01/den
if W1[j][0] <= 0:
loop.remove(j)
rss1 = w_rss(W1,x0,x1)
if rss1 < rss0:
#print W1
W0 = W1
rss0 = rss1
print '--'
print rss0
print W0
return W0,rss0
scipy中的SLSQP代码可以做到这一点。你可以直接使用scipy.optimize.minimize
with method='SLSQP
, or you can use the function fmin_slsqp
。在下面,我使用 fmin_slsqp
.
scipy 求解器通常将 一维 数组传递给 objective 函数,因此为了保持一致,我将更改 W
和 X1
是一维数组,我将编写 objective 函数(现在称为 w_rss1
)以期望一维参数 w
.
w
中所有元素必须在0到1之间的条件使用bounds
参数指定,和必须为1的条件使用[=22]指定=] 参数。约束函数returnsnp.sum(w) - 1
,所以元素之和为1时为0。
代码如下:
import numpy as np
from scipy.optimize import fmin_slsqp
def w_rss1(w, x0, x1):
predictions = np.dot(x0, w)
errors = x1 - predictions
rss = (errors**2).sum()
return rss
def sum1constraint(w, x0, x1):
return np.sum(w) - 1
X0 = np.array([[3,4,5,3],
[1,2,2,4],
[6,5,3,7],
[1,0,5,2]])
X1 = np.array([4, 2, 4, 2])
W = np.array([.0, .5, .5, .0])
result = fmin_slsqp(w_rss1, W, f_eqcons=sum1constraint, bounds=[(0.0, 1.0)]*len(W),
args=(X0, X1), disp=False, full_output=True)
Wopt, fW, its, imode, smode = result
if imode != 0:
print("Optimization failed: " + smode)
else:
print(Wopt)
当我运行这样的时候,输出是
[ 0.05172414 0.55172414 0.39655172 0. ]