- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目的:我试图在 python 中使用 cvxpy 来最大化 dual_func
,但是我得到下面的 SolverError,我相信它可能是 Variable
具有不同的维度,但似乎无法弄清楚这个问题。我试过使用其他求解器,如 ECOS,但无济于事。我是凸优化的新手,如果有人能帮助我指出代码中错误的正确方向,那就太好了。
问题:代码在 cvxpy 版本 0.4 中有效,但在最新的 cvxpy 版本中无效,给我错误:
SolverError: Either candidate conic solvers (['CVXOPT']) do not support the
cones output by the problem (SOC, ExpCone, PSD), or there are not enough
constraints in the problem.
dual_func
是凸的,是DCP,所以我仍然不确定为什么不能解决。
附加问题:是否可以在 cvxpy 中使用严格的不等式约束?文档指出这是不可能的,因为它在现实世界中没有意义,但是,我真的不明白为什么会这样。
from cvxpy import *
alpha_k = Variable()
mu_k_1 = Variable(shape=(int(len(h_undl_list))))
mu_k_2 = Variable(shape=(int(len(h_undl_list))))
covar_k_1 = Variable(shape=(int(len(h_undl_list)), int(len(h_undl_list))), PSD=True)
covar_k_2 = Variable(shape=(int(len(h_undl_list)), int(len(h_undl_list))), PSD=True)
# fitting the first 1000 returns with normal GMM
from sklearn import mixture
clf = mixture.GaussianMixture(n_components=2, max_iter=1000, tol=1e-7).fit(ret_df_period)
clf = mixture.GaussianMixture(n_components=2, max_iter=500, tol=1e-7, weights_init=[0.2, 0.8]).fit(ret_df_period)
print('weights')
print(clf.weights_)
# sorting the values to the normal regime or the stressed regime
if clf.weights_[0] > clf.weights_[1]:
alpha_k.value = clf.weights_[0]
mu_k_1.value = clf.means_[0]
mu_k_2.value = clf.means_[1]
covar_k_1.value = clf.covariances_[0]
covar_k_2.value = clf.covariances_[1]
else:
alpha_k.value = clf.weights_[1]
mu_k_1.value = clf.means_[1]
mu_k_2.value = clf.means_[0]
covar_k_1.value = clf.covariances_[1]
covar_k_2.value = clf.covariances_[0]
iter_t = 3
N = ret_df_period.shape[0] #time step, e.g. return at t
K = 2
for t_iter in range(iter_t):
q_k = [alpha_k.value, 1 - alpha_k.value]
mu_sk_list = [np.array(mu_k_1.value).flatten(), np.array(mu_k_2.value).flatten()]
covar_sk_list = [covar_k_1.value, covar_k_2.value]
q_posterior_list = []
q_posterior_map = {}
# E-Step
import math
# marginal probability, lambda_k * multivariate_normal.pdf, returns a matrix with K rows, N columns
mar_prob_list = np.zeros((K,N))
for k_idx_temp in range(0, K):
for j_temp in range(0, N):
mar_prob_list[k_idx_temp, j_temp] = (q_k[k_idx_temp] * multivariate_normal.pdf(ret_df_period.iloc[j_temp].values, mean = mu_sk_list[k_idx_temp], cov = covar_sk_list[k_idx_temp]))
# lambda_k_n, q_n, q_posterior_distribution, returns a matrix with K rows, N columns
for k_idx in range(0, K):
for j in range(0, N):
joint_prob_k = q_k[k_idx] * multivariate_normal.pdf(ret_df_period.iloc[j], mean = mu_sk_list[k_idx], cov = covar_sk_list[k_idx])
q_posterior = joint_prob_k / np.sum(mar_prob_list[:, j])
q_posterior_list.append(q_posterior)
q_posterior_map[k_idx] = q_posterior_list
q_posterior_list = []
#####a priori after E-Step, i.e. M-Step
# Empirical probability, returns the two lambda_sk values
alpha_sk_list = []
for k_idx in range(0, K):
alpha_sk = 0
for j in range(0, N):
alpha_sk += q_posterior_map[k_idx][j]
alpha_sk_list.append(alpha_sk / N)
alpha_sk_list[1] = 1 - alpha_sk_list[0]
# Mean, returns two sets of means
mu_sk_list = []
weighted_xs_map = {}
for k_idx in range(0, K):
weighted_xs_map[k_idx] = np.empty([int(len(h_undl_list)), N])
for k_idx in range(0, K):
mu_sk = 0
for j in range(0, N):
weighted_x = (q_posterior_map[k_idx][j]) * ret_df_period.iloc[j].values
mu_sk += weighted_x
weighted_xs_map[k_idx][:, j] = weighted_x / alpha_sk_list[k_idx] # should divide twice of alpha_sk here? Come back and double check later!!!
mu_sk_list.append(mu_sk / N / alpha_sk_list[k_idx])
# Cov, returns two cov
covar_sk_list = []
for k_idx in range(0, K):
sum_covar = 0
for j in range(0, N):
w0_temp = (ret_df_period.iloc[j] - mu_sk_list[k_idx]).values
w0_covar = np.outer(w0_temp, w0_temp)
weighted_covar = (q_posterior_map[k_idx][j]) * w0_covar
sum_covar += weighted_covar
sum_covar = sum_covar / (alpha_sk_list[k_idx] * N)
covar_sk_list.append(sum_covar)
#####
#information params
n_sk_list = []
for k_idx in range(0, K - 1):
n_sk = np.log(alpha_sk_list[k_idx] / (1 - (np.sum(alpha_sk_list[: -1]))))
n_sk_list.append(n_sk)
m_sk_list = []
for k_idx in range(0, K):
m_sk = np.dot(np.linalg.inv(covar_sk_list[k_idx]), mu_sk_list[k_idx])
m_sk_list.append(m_sk)
S_sk_list = []
for k_idx in range(0, K):
S_sk = np.linalg.inv(covar_sk_list[k_idx])
S_sk_list.append(S_sk)
alpha_sk_1 = Parameter(nonneg=True)
alpha_sk_2 = Parameter(nonneg=True)
n_sk_pr = Parameter()
dim = Parameter(nonneg=True)
m_sk_1 = Parameter(shape=(int(len(h_undl_list)),))
m_sk_2 = Parameter(shape=(int(len(h_undl_list)),))
alpha_sk_1.value = alpha_sk_list[0]
alpha_sk_2.value = alpha_sk_list[1]
n_sk_pr.value = n_sk_list[0]
m_sk_1.value = m_sk_list[0]
m_sk_2.value = m_sk_list[1]
dim.value = int(len(h_undl_list))
covar_k_tilde = Variable(shape=(int(len(h_undl_list)), int(len(h_undl_list))), PSD=True)
dual_func = entr(alpha_k) + entr(1 - alpha_k) + \
alpha_sk_1*0.5*log_det(covar_k_1) + alpha_sk_1*dim*0.5*log(2*np.e*np.pi) + alpha_sk_2*0.5*log_det(covar_k_1 + covar_k_tilde) + alpha_sk_2*dim*0.5*log(2*np.e*np.pi) + alpha_k*n_sk_pr + \
alpha_sk_1*(mu_k_1.T)*m_sk_1 - alpha_sk_1*0.5*trace(covar_k_1*S_sk_list[0]) - alpha_sk_1*0.5*quad_form(mu_k_1, S_sk_list[0]) + \
alpha_sk_2*(mu_k_1.T)*m_sk_2 - alpha_sk_2*0.5*trace((covar_k_1 + covar_k_tilde)*S_sk_list[1]) - alpha_sk_2*0.5*quad_form(mu_k_2, S_sk_list[1])
prob = Problem(Maximize(dual_func), [alpha_k == 0.96, mu_k_1 >= 0, mu_k_2 - mu_k_1 <= 0, mu_k_2 >= - mu_k_1, mu_k_2 <= 0])
print(prob.solve(solver=CVXOPT, verbose=True, kktsolver='robust', max_iters=1000))
print(t_iter)
covar_k_2.value = covar_k_1.value + covar_k_tilde.value
print(is_pos_def(covar_k_1.value))
print(is_pos_def(covar_k_tilde.value))
print(is_pos_def(covar_k_2.value))
covar_k_1_temp = np.array(covar_k_1.value)
covar_k_2_temp = np.array(covar_k_2.value)
covar_k_tilde_temp = np.array(covar_k_tilde.value)
mu_k_1_temp = np.array(mu_k_1.value).flatten()
mu_k_2_temp = np.array(mu_k_2.value).flatten()
D_1 = np.diag(np.sqrt(np.diag(covar_k_1_temp)))
correl_k_1 = np.dot(np.dot(np.linalg.inv(D_1), covar_k_1_temp), np.linalg.inv(D_1))
D2 = np.diag(np.sqrt(np.diag(covar_k_2_temp)))
correl_k_2 = np.dot(np.dot(np.linalg.inv(D_2), covar_k_2_temp), np.linalg.inv(D_2))
错误:
---------------------------------------------------------------------------
SolverError Traceback (most recent call last)
<ipython-input-28-1e1e9c7b0d73> in <module>
109 prob = Problem(Maximize(dual_func), [alpha_k == 0.96, mu_k_1 >= 0, mu_k_2 - mu_k_1 <= 0, mu_k_2 >= - mu_k_1, mu_k_2 <= 0])
110
--> 111 print(prob.solve(solver=CVXOPT, verbose=True, kktsolver='robust', max_iters=1000))
112 print(t_iter)
113 covar_k_2.value = covar_k_1.value + covar_k_tilde.value
~\Anaconda3\lib\site-packages\cvxpy\problems\problem.py in solve(self, *args, **kwargs)
287 else:
288 solve_func = Problem._solve
--> 289 return solve_func(self, *args, **kwargs)
290
291 @classmethod
~\Anaconda3\lib\site-packages\cvxpy\problems\problem.py in _solve(self, solver, warm_start, verbose, parallel, gp, qcp, **kwargs)
565 solver, warm_start, verbose, **kwargs)
566
--> 567 self._construct_chains(solver=solver, gp=gp)
568 data, solving_inverse_data = self._solving_chain.apply(
569 self._intermediate_problem)
~\Anaconda3\lib\site-packages\cvxpy\problems\problem.py in _construct_chains(self, solver, gp)
508
509 except Exception as e:
--> 510 raise e
511
512 def _solve(self,
~\Anaconda3\lib\site-packages\cvxpy\problems\problem.py in _construct_chains(self, solver, gp)
503 self._solving_chain = \
504 construct_solving_chain(self._intermediate_problem,
--> 505 candidate_solvers)
506
507 self._cached_chain_key = chain_key
~\Anaconda3\lib\site-packages\cvxpy\reductions\solvers\solving_chain.py in construct_solving_chain(problem, candidates)
93 "enough constraints in the problem." % (
94 candidates['conic_solvers'],
---> 95 ", ".join([cone.__name__ for cone in cones])))
96
97
SolverError: Either candidate conic solvers (['CVXOPT']) do not support the cones output by the problem (SOC, ExpCone, PSD), or there are not enough constraints in the problem.
代码引用自:https://www.maths.ox.ac.uk/system/files/attachments/TT18_dissertation_Vu_0.pdf
最佳答案
您的目标包含 PSD 矩阵、log_det 和 entr,因此您需要一个支持半定锥和指数锥的求解器。据我所知,只有 MOSEK 9 和 SCS 可以在 CVXPY 中为您完成这两项工作。
严格的不等式没有实际意义,因为浮点运算的精度和未达到的问题。考虑最小化 x 服从 x>0。具有严格不等式的问题往往在极限中有最佳点,这意味着您无论如何都在合并非严格闭包。
关于Python:CVXPY 解算器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59525851/
我之前让 dll 注入(inject)器变得简单,但我有 Windows 7,我用 C# 和 C++ 做了它,它工作得很好!但是现在当我在 Windows 8 中尝试相同的代码时,它似乎没有以正确的方
我正在尝试制作一个名为 core-splitter 的元素,该元素在 1.0 中已弃用,因为它在我们的项目中起着关键作用。 如果您不知道 core-splitter 的作用,我可以提供一个简短的描述。
我有几个不同的蜘蛛,想一次运行所有它们。基于 this和 this ,我可以在同一个进程中运行多个蜘蛛。但是,我不知道如何设计一个信号系统来在所有蜘蛛都完成后停止 react 器。 我试过了: cra
有没有办法在达到特定条件时停止扭曲 react 器。例如,如果一个变量被设置为某个值,那么 react 器应该停止吗? 最佳答案 理想情况下,您不会将变量设置为一个值并停止 react 器,而是调用
https://code.angularjs.org/1.0.0rc9/angular-1.0.0rc9.js 上面的链接定义了外部js文件,我不知道Angular-1.0.0rc9.js的注入(in
我正在尝试运行一个函数并将服务注入(inject)其中。我认为这可以使用 $injector 轻松完成.所以我尝试了以下(简化示例): angular.injector().invoke( [ "$q
在 google Guice 中,我可以使用函数 createInjector 创建基于多个模块的注入(inject)器。 因为我使用 GWT.create 在 GoogleGin 中实例化注入(in
我在 ASP.NET Core 1.1 解决方案中使用配置绑定(bind)。基本上,我在“ConfigureServices Startup”部分中有一些用于绑定(bind)的简单代码,如下所示: s
我在 Spring MVC 中设置 initBinder 时遇到一些问题。我有一个 ModelAttribute,它有一个有时会显示的字段。 public class Model { privat
我正在尝试通过jquery post发布knockoutjs View 模型 var $form = $('#barcodeTemplate form'); var data = ko.toJS(vm
如何为包含多态对象集合的复杂模型编写自定义模型绑定(bind)程序? 我有下一个模型结构: public class CustomAttributeValueViewModel { publi
您好,我正在尝试实现我在 this article 中找到的扩展方法对于简单的注入(inject)器,因为它不支持开箱即用的特定构造函数的注册。 根据这篇文章,我需要用一个假的委托(delegate)
你好,我想自动注册我的依赖项。 我现在拥有的是: public interface IRepository where T : class public interface IFolderReposi
我正在使用 Jasmine 测试一些 Angular.js 代码。为此,我需要一个 Angular 注入(inject)器: var injector = angular.injector(['ng'
我正在使用 Matlab 代码生成器。不可能包含代码风格指南。这就是为什么我正在寻找一个工具来“ reshape ”、重命名和重新格式化生成的代码,根据我的: 功能横幅约定 文件横幅约定 命名约定 等
这个问题在这里已经有了答案: Where and why do I have to put the "template" and "typename" keywords? (8 个答案) 关闭 8
我开发了一种工具,可以更改某些程序的外观。为此,我需要在某些进程中注入(inject)一个 dll。 现在我基本上使用这个 approach .问题通常是人们无法注入(inject) dll,因为他们
我想使用 swing、spring 和 hibernate 编写一个 java 应用程序。 我想使用数据绑定(bind)器用 bean 的值填充 gui,并且我还希望它反射(reflect) gui
我有这段代码,当两个蜘蛛完成后,程序仍在运行。 #!C:\Python27\python.exe from twisted.internet import reactor from scrapy.cr
要点是 Spring Batch (v2) 测试框架具有带有 @Autowired 注释的 JobLauncherTestUtils.setJob。我们的测试套件有多个 Job 类提供者。因为这个类不
我是一名优秀的程序员,十分优秀!