TypeError:必须是实数,不能是LpAffineExpression, Optimization with PuL



我有以下代码:

首先定义闵可夫斯基距离。它是两个向量之间的距离。X表示向量1,y表示向量2,w表示所有准则的权重,p_value表示闵可夫斯基距离的p。

def p_root(value, root):
root_value = 1 / float(root)
return float(round(Decimal(value) **
Decimal(root_value), 3))
def minkowski_distance(x, y, w, p_value):
# pass the p_root function to calculate
# all the value of vector parallelly
return (p_root(sum(pow(c*(abs(a - b)), p_value)
for a, b, c in zip(x, y, w)), p_value))

然后使用PuLP进行优化。

prob = LpProblem("Sorting Problem", LpMinimize)
w1 = LpVariable("Weight_1", 0, cat="Continuous")
w2 = LpVariable("Weight_2", 0, cat="Continuous")
w3 = LpVariable("Weight_3", 0, cat="Continuous")
w4 = LpVariable("Weight_4", 0, cat="Continuous")
epsilon1=LpVariable("Classification_Error_1",0, cat="Continuous")
epsilon2=LpVariable("Classification_Error_2",0, cat="Continuous")
epsilon3=LpVariable("Classification_Error_3",0, cat="Continuous")
epsilon4=LpVariable("Classification_Error_4",0, cat="Continuous")
.
.
.

这里,epsilon值表示分类误差,目标是最小化它们。

prob += (
epsilon1+epsilon2+epsilon3+epsilon4+epsilon5+epsilon6+epsilon7+epsilon8+epsilon9+epsilon10+epsilon11+epsilon12,
"Sum_of_Classification_Errors",
)

这使得所有标准权重之和等于1。

prob+= w1+w2+w3+w4 == 1

这里,我把权重值放在一个列表中,以便在minkowski函数中使用。

w=[w1,w2,w3,w4]

当一个备选项被分配到比它实际更接近的质心更远的质心时,就会发生分类错误。在这里,我们表示它。

prob+= minkowski_distance(train_vector[0],centroid_vector[0],w,1) - epsilon1<=minkowski_distance(train_vector[0],centroid_vector[1],w,1)-r
prob+= minkowski_distance(train_vector[0],centroid_vector[0],w,1) - epsilon1<=minkowski_distance(train_vector[0],centroid_vector[2],w,1)-r
.
.
.

但是,此时我得到了以下错误。TypeError:必须是实数,不能是LpAffineExpression。在发布这个问题之前,我已经检查了其他类似的问题,这些问题中的问题是试图用PuLP(它是一个线性规划求解器)解决非线性问题,或者混淆线性程序中变量的含义。我相信在闵可夫斯基距离中还有另一种情况当距离范数为1或无穷大时,问题是线性的。我在这里使用距离范数为1,但仍然得到了这个错误。

p。S:我知道代码看起来不是很有效,但是我在试图使它更有效的过程中遇到了一些错误,现在我在简化它之前试图确保代码本身可以工作。

PuLP仅适用于线性模型(请参阅文档)。你试着传递一个非线性模型。显然,这是行不通的。没有什么好理由去尝试。

给出的代码是不完整的,所以很难破译到底发生了什么,但是你可以使用距离函数,只要它只依赖于外生数据。也就是说,权重(决策变量)不应该是距离函数的一部分。

相关内容

  • 没有找到相关文章

最新更新