【机器学习6】python实现拉格朗日乘子法

1.拉格朗日乘子法

题目如下:等式约束下的拉格朗日乘子法求解过程
在这里插入图片描述

2.python --拉格朗日乘子法

题目如上:

from scipy.optimize import minimize
import numpy as np 
 
#目标函数:
def func(args):
    fun = lambda x: 60 - 10*x[0] - 4*x[1] + x[0]**2 + x[1]**2 - x[0]*x[1]
    #fun = lambda x: 10 - x[0]**2 - x[1]**2
    return fun
 
#约束条件,包括等式约束和不等式约束
def con(args):
    cons = ({'type': 'eq', 'fun': lambda x: x[0]+x[1]-8})
    #cons = ({'type': 'ineq', 'fun': lambda x: x[1]-x[0]**2},
    #        {'type': 'eq', 'fun': lambda x: x[0]+x[1]})
    return cons 
 
if __name__ == "__main__":
    args = ()
    args1 = ()
    cons = con(args1)
    x0 = np.array((2.0, 1.0))  #设置初始值,初始值的设置很重要,很容易收敛到另外的极值点中,建议多试几个值
    
    #求解#
    res = minimize(func(args), x0, method='SLSQP', constraints=cons)
    print(res.success)
    print("x1=",res.x[0],";  x2=",res.x[1])
    print("最优解为:",res.fun)

结果如下:
在这里插入图片描述

3.python sympy包 --拉格朗日乘子法

题目如上:

#导入sympy包,用于求导,方程组求解等等
from sympy import * 
 
#设置变量
x1 = symbols("x1")
x2 = symbols("x2")
alpha = symbols("alpha")
#beta = symbols("beta")
 
#构造拉格朗日等式
L = 60 - 10*x1 - 4*x2 + x1*x1 + x2*x2 - x1*x2 - alpha * (x1 + x2 - 8)
 
#求导,构造KKT条件
difyL_x1 = diff(L, x1)  #对变量x1求导
difyL_x2 = diff(L, x2)  #对变量x2求导
difyL_alpha = diff(L, alpha) #对alpha求导
 
#求解KKT等式
aa = solve([difyL_x1, difyL_x2, difyL_alpha], [x1, x2, alpha])
print(aa)
x1=aa.get(x1)
x2=aa.get(x2)
alpha=aa.get(alpha)
print("最优解为:",60 - 10*x1 - 4*x2 + x1*x1 + x2*x2 - x1*x2 - alpha * (x1 + x2 - 8))

结果如下:
在这里插入图片描述
三种方法,结果一致!!

首先,我们先回顾一下模糊C均值聚类(FCM)的目标函数: $$J(U,V)=\sum_{i=1}^n\sum_{j=1}^c u_{ij}^m||x_i-v_j||^2$$ 其中,$U=[u_{ij}]_{n\times c}$ 是每个数据点 $x_i$ 对于每个聚类中心 $v_j$ 的隶属度矩阵,$V=[v_j]_{c\times d}$ 表示聚类中心矩阵,$m$ 是模糊度参数。 我们的目标是最小化目标函数 $J(U,V)$。 现在我们引入拉格朗日乘子法来解决这个问题。我们要最小化 $J(U,V)$,同时满足以下限制条件: $$\sum_{j=1}^c u_{ij}=1 \quad \text{for } i=1,2,...,n$$ 这意味着每个数据点 $x_i$ 的隶属度之和必须等于 $1$,即每个数据点必须属于某个聚类中心。 我们引入拉格朗日乘子 $\beta_i$ 并把限制条件加入目标函数中,得到: $$J(U,V,\beta)=\sum_{i=1}^n\sum_{j=1}^c u_{ij}^m||x_i-v_j||^2-\sum_{i=1}^n\beta_i(\sum_{j=1}^c u_{ij}-1)$$ 现在我们要最小化 $J(U,V,\beta)$,并且要满足 $\dfrac{\partial J}{\partial u_{ij}}=0$ 和 $\dfrac{\partial J}{\partial v_j}=0$ 两个条件。 求解 $\dfrac{\partial J}{\partial u_{ij}}=0$,可以得到: $$u_{ij}=\frac{1}{\sum_{k=1}^c(\dfrac{||x_i-v_j||}{||x_i-v_k||})^{\frac{2}{m-1}}}$$ 这个式子表示了数据点 $x_i$ 对聚类中心 $v_j$ 的隶属度。 求解 $\dfrac{\partial J}{\partial v_j}=0$,可以得到: $$v_j=\frac{\sum_{i=1}^n u_{ij}^m x_i}{\sum_{i=1}^n u_{ij}^m}$$ 这个式子表示了聚类中心 $v_j$ 的位置。 最后,我们要满足 $\dfrac{\partial J}{\partial \beta_i}=0$,即: $$\sum_{j=1}^c u_{ij}-1=0$$ 这个式子表示了每个数据点 $x_i$ 的隶属度之和必须等于 $1$。 综上所述,拉格朗日乘子法推导出的模糊C均值聚类算法如下: 1. 初始化聚类中心 $V=[v_j]_{c\times d}$; 2. 计算每个数据点 $x_i$ 对于每个聚类中心 $v_j$ 的隶属度 $u_{ij}$; 3. 计算每个聚类中心 $v_j$ 的位置 $v_j$; 4. 检查每个数据点 $x_i$ 的隶属度之和是否等于 $1$,如果不等于 $1$,则重新计算隶属度; 5. 重复步骤 2-4,直到聚类中心不再变化或达到最大迭代次数。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值