0
我试图找到一个向量,使乘法矩阵的残差平方和最小。查找使函数最小化的最佳向量
我知道scipy的优化包(它具有最小化函数)。但是,我的代码有一个额外的限制。 w的所有条目的总和(见下面的函数)必须等于1,并且w的任何条目都不能小于0. 是否有一个包为我做了这个?如果不是,我该怎么做?
试图尽量减少宽:
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
你可以使用任何QP(二次规划)求解器。 –
我试过这个在scipy.optimize:cons =({'type':'eq','fun':lambda x:1 - sum(x)}){{NEW LINE}} bnds = tuple((0,1 )对于x中的W){{NEW LINE}}最小化(w_rss,W1,args =(V,X0,X1),method ='SLSQP',bounds = bnds,constraints = cons)。解决方案不正确。 –
这是一个通用的NLP解算器。它应该能够正确设置问题,但我会建议使用真正的QP解算器。 –