python - scipy.optimize.minimize 无法收敛具有约束的矩阵输入

标签 python scipy cvxpy

(第一个问题,如果在某些方面不好,将进行编辑。在发布之前进行了研究)

我想预测 x*C=y(x 和 y 是数据集,C 是矩阵),约束条件是 C 的行总和为 1,并且其元素介于 0 和 1 之间。

因为受约束的是行,而不是列,所以我不能只使用线性回归并且必须记下误差函数。 我在 Matlab 中成功地做到了这一点,所以我知道它不在数据或方法中,但可能在我的代码中。

我的代码(下面)给出了这两个错误之一(取决于随机初始猜测,我假设):

More than 3*n iterations in LSQ subproblem    (Exit mode 3)
Inequality constraints incompatible    (Exit mode 4)

如有任何帮助,我们将不胜感激。我是 Python 的新手,在这方面花了很多时间。

M1=data_2013.shape[1]
M2=data_2015.shape[1]

def error_function(C):
    C=C.reshape(M1,M2)
    return np.sum(np.sum((np.dot(data_2013,C)-data_2015)**2))

def between_zero_and_one(x):
    x=x.reshape(x.size)
    return x*(1-x)

def eq_constraint(x):
    x=x.reshape(M1,M2)
    return x.sum(axis=1) - 1

cons = [{'type': 'ineq', 'fun': between_zero_and_one}, 
        {'type': 'eq', 'fun': eq_constraint}]


C0=np.random.rand(M1,M2)
result=minimize(error_function,C0, constraints=cons, options={'disp': True, 'maxiter': 10000})

最佳答案

Sascha 的回答对我有帮助 - 问题与 cvxpy 很好地融合了.

代码:

M1=x_data.shape[1]
M2=y_data.shape[1]
C=cvx.Variable(x_data.shape[1],y_data.shape[1])
constraints=[0<=C, C<=1, cvx.sum_entries(C,axis=1)==1]
objective=cvx.Minimize(cvx.norm((x_data.values*C)-y_data.values))
prob=cvx.Problem(objective, constraints)
prob.solve()
C_mat=C.value

谢谢,萨沙!

关于python - scipy.optimize.minimize 无法收敛具有约束的矩阵输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47731375/

相关文章:

python-3.x - 无法分配形状为 (1482535, 67826) 且数据类型为 int64 的数组

python - numpy 数组切片的意外结果(查看与复制)

python - 强制变量为整数 CVXPY

python - CVXPY:有效编写成对和的约束

python - Keras - LSTM 如何 reshape 输入值

python - python 中 qq-plot(或 probplot)的逐点置信度包络线

python - Django 在运行时添加模型方法

python - CVXPY 导入错误 - 'sum_entries' 未定义

Python 从逗号分隔值中动态选择值

python - 如何使用 SciPy 以不同的采样率读取 .wav 文件?