尝试求解线性方程组,其中我的输出之一是未知的,但我知道它需要最大化
Attempting to solve a system of linear equations, where one of my outputs is unknown but I do know it needs to be maximized
我正在尝试求解一组线性方程。我有五个随机分配的变量,总和为 1。我将这些变量按行应用于矩阵(即 Ax = B)但是,需要注意的是,我的 B 变量之一需要最大化,但要遵守约束条件我的其余 B 变量为 0。我的数据如下:
import pandas as pd
A = [[0.031982, 0.02606, 0.055933, 0.004529, 0.064116],
[-0.000167, 0.181031, 0.145465, 0.120430, 0.114093],
[0.627812, 0.254377, 0.138211, 0.41156, -0.000801],
[-0.228139, 0.377169, 0.085415, 0.008888, -0.020791],
[-0.067697, -0.114113, 0.089583, 0.100222, -0.005291]]
B = [[maximized],
[0],
[0],
[0],
[0]]
x = [x1, x2, x3, x4, x5]
注意:'maximized'是我试图最大化的值
到目前为止我做了什么:
import numpy as np
ABC=[]
A = DataFrame(A)
N=1000 #my attempt at maximizing by repeating the sequence N times and taking the largest value that results
for i in range(N):
x = np.random.rand(5) #creating random variables
x/= np.sum(x) #so that they sum to one
x=x*A.T[0] #I apply the variables to my data. I want to maximize the sum of the first column, so I transpose and take a slice that I sum below
x=x.sum()
ABC.append(x)
ABC = DataFrame(ABC)
A2=ABC.sort_values(by=0,ascending=False).head(1) #I sort by largest first and take the highest value and store in a new dataframe
maximized=np.array(A2) #I convert the dataframe back into an array
B = [[maximized],[0],[0],[0],[0]]
X = np.linalg.inv(A).dot(B)
X
显然这有很多错误,并没有真正实现我想要的。我想要做的是 运行 一个最大化函数,它给我最大值并将该值输入到我的矩阵中。我真的不知道从这里去哪里,或者在这种情况下适用哪种最大化函数。如果有人有任何想法,那将不胜感激!
如果我没理解错的话,你有一个给定的矩阵A
。然后你想找到一个总和为 1 的正向量 x
,这样如果 Ax = b
那么 b
是全零向量,除了第一个条目被最大化,而不是零。
设A0
为矩阵的第一行A
,其余为Ar
。然后我们可以将您的问题改写为:
Find vector x
such that its entries are non-negative, sum to 1, where Ar x = b
, b = 0
and maximizing A0 x
.
这只是一个标准的线性规划实例(通过向 Ar
添加单个全一行和向 b
添加 1
条目来处理 'sum-to-1' 要求).
我认为这并不是真正的最大化问题。指定结果只有一个答案。如果我们的最大数是 c
,那么 b = [[c,0,0,0,0]].T = c*[[1,0,0,0,0]].T
让我们将 b_
设置为 [[1,0,0,0,0]].T
所以 b = c*b_
如果我们用 x_ = Ainv @ b_
求解 A @ x_ = b_
,我们会得到一个 x_
矩阵,它仍然需要归一化以形成 x
。如果len_x_ = np.linalg.norm(x_)
,那么:
A @ (c * x_) = (c * b_) # multiplying `c` though
A @ (c * x_) = b # substituting `b = c * b_`
c * x_ = x = x_ / len_x_ # therefore . . .
c = 1 / len_x_
如果A
是正定的,c
只能取一个值,因此x
只能取一个值:
b_ = np.array([[1,0,0,0,0]])
x_ = np.linalg.inv(A).dot(b_)
c = 1 / np.linalg.norm(x_)
b = b_ * c
x = x_ * c
现在,如果 A
不是确定的(即它没有逆),它会变得 很多 更有趣。但我不确定这是否在范围内,因为您目前正在通过反转 A
.
来解决
我正在尝试求解一组线性方程。我有五个随机分配的变量,总和为 1。我将这些变量按行应用于矩阵(即 Ax = B)但是,需要注意的是,我的 B 变量之一需要最大化,但要遵守约束条件我的其余 B 变量为 0。我的数据如下:
import pandas as pd
A = [[0.031982, 0.02606, 0.055933, 0.004529, 0.064116],
[-0.000167, 0.181031, 0.145465, 0.120430, 0.114093],
[0.627812, 0.254377, 0.138211, 0.41156, -0.000801],
[-0.228139, 0.377169, 0.085415, 0.008888, -0.020791],
[-0.067697, -0.114113, 0.089583, 0.100222, -0.005291]]
B = [[maximized],
[0],
[0],
[0],
[0]]
x = [x1, x2, x3, x4, x5]
注意:'maximized'是我试图最大化的值
到目前为止我做了什么:
import numpy as np
ABC=[]
A = DataFrame(A)
N=1000 #my attempt at maximizing by repeating the sequence N times and taking the largest value that results
for i in range(N):
x = np.random.rand(5) #creating random variables
x/= np.sum(x) #so that they sum to one
x=x*A.T[0] #I apply the variables to my data. I want to maximize the sum of the first column, so I transpose and take a slice that I sum below
x=x.sum()
ABC.append(x)
ABC = DataFrame(ABC)
A2=ABC.sort_values(by=0,ascending=False).head(1) #I sort by largest first and take the highest value and store in a new dataframe
maximized=np.array(A2) #I convert the dataframe back into an array
B = [[maximized],[0],[0],[0],[0]]
X = np.linalg.inv(A).dot(B)
X
显然这有很多错误,并没有真正实现我想要的。我想要做的是 运行 一个最大化函数,它给我最大值并将该值输入到我的矩阵中。我真的不知道从这里去哪里,或者在这种情况下适用哪种最大化函数。如果有人有任何想法,那将不胜感激!
如果我没理解错的话,你有一个给定的矩阵A
。然后你想找到一个总和为 1 的正向量 x
,这样如果 Ax = b
那么 b
是全零向量,除了第一个条目被最大化,而不是零。
设A0
为矩阵的第一行A
,其余为Ar
。然后我们可以将您的问题改写为:
Find vector
x
such that its entries are non-negative, sum to 1, whereAr x = b
,b = 0
and maximizingA0 x
.
这只是一个标准的线性规划实例(通过向 Ar
添加单个全一行和向 b
添加 1
条目来处理 'sum-to-1' 要求).
我认为这并不是真正的最大化问题。指定结果只有一个答案。如果我们的最大数是 c
,那么 b = [[c,0,0,0,0]].T = c*[[1,0,0,0,0]].T
让我们将 b_
设置为 [[1,0,0,0,0]].T
所以 b = c*b_
如果我们用 x_ = Ainv @ b_
求解 A @ x_ = b_
,我们会得到一个 x_
矩阵,它仍然需要归一化以形成 x
。如果len_x_ = np.linalg.norm(x_)
,那么:
A @ (c * x_) = (c * b_) # multiplying `c` though
A @ (c * x_) = b # substituting `b = c * b_`
c * x_ = x = x_ / len_x_ # therefore . . .
c = 1 / len_x_
如果A
是正定的,c
只能取一个值,因此x
只能取一个值:
b_ = np.array([[1,0,0,0,0]])
x_ = np.linalg.inv(A).dot(b_)
c = 1 / np.linalg.norm(x_)
b = b_ * c
x = x_ * c
现在,如果 A
不是确定的(即它没有逆),它会变得 很多 更有趣。但我不确定这是否在范围内,因为您目前正在通过反转 A
.