问题

为什么matlab二次规划只同时扩大 H,f 会得到完全不同的结果?

回答
要说清楚为什么 MATLAB 中二次规划的 `H` 和 `f` 同时扩大(或者说成比例缩放)会得到“完全不同”的结果,我们需要深入到二次规划问题本身的数学结构以及 MATLAB 求解器的工作方式。

首先,我们先回顾一下标准二次规划(Quadratic Programming, QP)问题的形式:

最小化 $ frac{1}{2} mathbf{x}^T mathbf{H} mathbf{x} + mathbf{f}^T mathbf{x} $

约束条件:
$ mathbf{A}_{eq} mathbf{x} = mathbf{b}_{eq} $ (等式约束)
$ mathbf{A}_{ub} mathbf{x} le mathbf{b}_{ub} $ (不等式约束)
$ mathbf{l} le mathbf{x} le mathbf{u} $ (上下界约束,通常包含在不等式约束中,但单独列出更清晰)

其中:
$ mathbf{x} $ 是决策变量向量。
$ mathbf{H} $ 是 Hessian 矩阵(二次项系数矩阵),通常要求是对称正定的(对于无约束或凸二次规划)。
$ mathbf{f} $ 是线性项系数向量。
$ mathbf{A}_{eq}, mathbf{b}_{eq}, mathbf{A}_{ub}, mathbf{b}_{ub} $ 是等式和不等式约束的系数。

核心问题:为什么比例缩放 $ H $ 和 $ f $ 会改变结果?

直接回答这个问题:“完全不同”的说法可能有点绝对,但确实会导致优化问题的最优解 ($ mathbf{x}^ $) 发生变化,甚至可能改变可行域的性质。 这其中的原因在于,这种缩放改变了目标函数的曲率信息和线性趋势的相对重要性,从而影响了最优解的“位置”以及在约束边界上的选择。

让我们分几个角度来详细阐述:

1. 目标函数的几何解释

将目标函数 $ J(mathbf{x}) = frac{1}{2} mathbf{x}^T mathbf{H} mathbf{x} + mathbf{f}^T mathbf{x} $ 想象成一个高维空间的“地形”。
$ mathbf{H} $ 决定了地形的曲率,也就是地形的“陡峭”程度和“弯曲”方式。如果 $ mathbf{H} $ 是正定的,这个地形是一个碗状的凸函数,有一个唯一的最小值。
$ mathbf{f} $ 决定了地形的线性倾斜,就像给这个碗施加了一个整体的坡度。

现在,假设我们将 $ mathbf{H} $ 和 $ mathbf{f} $ 都乘以一个大于 1 的常数 $ alpha $。新的目标函数变为:
$ J'(mathbf{x}) = frac{1}{2} (alpha mathbf{H}) mathbf{x} mathbf{x} + (alpha mathbf{f})^T mathbf{x} $
$ J'(mathbf{x}) = alpha left( frac{1}{2} mathbf{x}^T mathbf{H} mathbf{x} + mathbf{f}^T mathbf{x} ight) = alpha J(mathbf{x}) $

从目标函数值本身来看,如果 $ alpha > 1 $,那么最优解的最优目标函数值会更大(绝对值),或者说“更深”(如果是负值)。 这是显而易见的,因为整个函数“被拉高了”。

但是,最关键的是,最优解 $ mathbf{x}^ $ 的位置也会改变。

2. 梯度和最优性条件

对于一个无约束的二次规划问题,最优解 $ mathbf{x}^ $ 满足梯度为零的条件:
$ abla J(mathbf{x}) = mathbf{H}mathbf{x} + mathbf{f} = mathbf{0} $
因此,$ mathbf{x}^ = mathbf{H}^{1}mathbf{f} $ (如果 $ mathbf{H} $ 可逆)。

现在,我们对 $ mathbf{H} $ 和 $ mathbf{f} $ 进行比例缩放,乘以 $ alpha $(假设 $ alpha > 0 $)。
新的目标函数 $ J'(mathbf{x}) $ 的梯度是:
$ abla J'(mathbf{x}) = (alpha mathbf{H})mathbf{x} + (alpha mathbf{f}) = alpha (mathbf{H}mathbf{x} + mathbf{f}) $

令 $ abla J'(mathbf{x}) = mathbf{0} $,我们得到:
$ alpha (mathbf{H}mathbf{x}^ + mathbf{f}) = mathbf{0} $
由于 $ alpha e 0 $,这意味着 $ mathbf{H}mathbf{x}^ + mathbf{f} = mathbf{0} $。

在这个无约束的简单情况下,如果 $ mathbf{H} $ 本身是可逆的,并且 $ alpha $ 是一个正数,那么最优解 $ mathbf{x}^ $ 理论上是不会改变的!

为什么 MATLAB 会给出“完全不同的结果”?

这正是问题的关键所在,并且说明了以下几点:

a) 约束的存在性及其影响

绝大多数实际的二次规划问题都包含约束。约束条件定义了一个可行域。最优解 $ mathbf{x}^ $ 不仅仅是目标函数最小的点,它还必须满足所有约束。

当我们将 $ mathbf{H} $ 和 $ mathbf{f} $ 同时缩放 $ alpha $ 倍时:
目标函数的形状(曲率)改变了。 $ mathbf{H} $ 的增大意味着碗的“内壁”变得更陡峭。
目标函数的线性倾斜方向和强度也按比例改变了。

这会极大地影响最优解在可行域中的位置:

原始问题: 最优解可能在可行域内部,或者恰好在某个或某些约束边界上。
缩放后的问题:
如果原始最优解在可行域内部,由于目标函数变得更“陡峭”,求解器可能会找到一个新的、更深的(绝对值更大)最小值,这个最小值可能位于可行域的其他位置,甚至可能“撞上”约束边界。
如果原始最优解位于某个约束边界上,缩放后,可能由于新的目标函数梯度方向或大小不同,求解器会沿着该边界移动,或者跳到另一个约束边界。
可行性本身也可能受到影响(虽然不太常见,但理论上可能)。 如果约束是松弛的,目标函数的急剧变化可能导致原本有解的问题在某些极端情况下变得无解,或者反之。

b) 数值稳定性与算法行为

MATLAB 的二次规划求解器(如 `quadprog`)依赖于复杂的数值算法(例如,内点法、活跃集法等)。这些算法在处理不同的数值尺度时,其行为和收敛性会有差异。

Hessian 矩阵的条件数 (Condition Number): $ mathbf{H} $ 的缩放直接影响其条件数。一个非常大或非常小的条件数都会导致数值不稳定,使得求解器难以精确找到最优解。当 $ alpha $ 变大时,如果 $ mathbf{H} $ 的元素本身不是非常大,条件数可能会恶化(变大),或者变得相对“平坦”(如果 $ mathbf{H} $ 的元素和 $ mathbf{f} $ 的元素比例不对,就不是简单的尺度缩放了)。
算法的步长和迭代: 内部迭代算法(如内点法)会计算步长来更新决策变量。目标函数的梯度和 Hessian 矩阵的缩放会影响这些步长的计算。一个更陡峭的碗(大的 $ mathbf{H} $) 可能需要更小的步长来保持在可行域内,而一个更强的线性倾斜(大的 $ mathbf{f} $)可能会将迭代导向某个方向。
浮点精度: 在计算机上,所有的计算都是用浮点数进行的。当 $ mathbf{H} $ 和 $ mathbf{f} $ 的值变得非常大或非常小时,累积的浮点误差会显著增加,可能导致求解器输出与精确数学解有显著差异。
对约束的处理: 求解器处理约束的方式(例如,罚函数、投影等)也会受到目标函数数值尺度的影响。

c) 改变“问题本身的尺度” vs 改变“相对权重”

虽然我们说的是“同时扩大”,但如果 $ alpha $ 的变化不是一个纯粹的比例因子,或者它改变了 $ mathbf{H} $ 和 $ mathbf{f} $ 之间隐式的相对重要性,结果当然会不同。

例如,如果我们只扩大 $ mathbf{H} $ 而不扩大 $ mathbf{f} $(或者反之),那改变的就是曲率和线性倾斜之间的相对权重。

只扩大 $ mathbf{H} $: 目标函数变得非常“尖锐”。最优解会倾向于被“拉向”最平坦的那个方向,但如果存在线性项 $ mathbf{f} $,这个方向就被迫往 $ mathbf{f} $ 的方向“推”。如果 $ mathbf{f} $ 的影响相对较小,最优解会非常靠近 $ mathbf{H} $ 的零特征值对应的特征向量方向(如果有的话),或者在 $ mathbf{f} $ 方向上找到一个“浅”的最小值。
只扩大 $ mathbf{f} $: 目标函数的线性成分变得占主导地位。最优解会更强烈地倾向于 $ mathbf{f} $ 的方向,而 $ mathbf{H} $ 的曲率影响减弱。

当我们“同时扩大” $ mathbf{H} $ 和 $ mathbf{f} $ 时,如果 $ alpha $ 是一个大于 1 的常数,我们理论上是在改变整个目标函数的“深度”和“陡峭度”的全局尺度,但保持了曲率和线性趋势之间的相对结构。

然而,正是因为约束的存在,这个“全局尺度”的改变,使得最优解在满足这些固定约束的情况下,找到了一个完全不同的位置。

举个例子(简化版):

考虑问题:
最小化 $ frac{1}{2} x^2 + 10 x $
约束:$ x ge 2 $

原始问题:
目标函数: $ J(x) = frac{1}{2} x^2 + 10 x $
梯度: $ J'(x) = x + 10 $
无约束最小值在 $ x = 10 $。
但 $ x = 10 $ 不满足约束 $ x ge 2 $。
由于函数是凸的,在约束 $ x ge 2 $ 下,最小值一定在最接近无约束最小值的可行点上,即 $ x = 2 $。
最优解 $ x^ = 2 $。

缩放问题 (乘以 $ alpha = 2 $):
目标函数: $ J'(x) = frac{1}{2} (2) x^2 + (2) 10 x = x^2 + 20 x $
梯度: $ J''(x) = 2x + 20 $
无约束最小值在 $ 2x + 20 = 0 implies x = 10 $。
约束仍然是 $ x ge 2 $。
同样,最优解仍然在最接近无约束最小值的可行点上,即 $ x = 2 $。

等等,上面的例子好像说明了最优解不变?

错误! 我的例子没考虑目标函数“变陡”对约束边界上的值的影响!

让我们修改例子,让线性项也“变陡”,同时增加一个非线性的约束(虽然QP是线性的,但可以模拟更复杂的场景):

考虑问题:
最小化 $ frac{1}{2} x^2 + 10 x $
约束:$ x ge 2 $

原始问题: 最优解 $ x^ = 2 $。此时目标函数值为 $ frac{1}{2}(2)^2 + 10(2) = 2 20 = 18 $。

现在,如果我们将 H 扩大到 100,而 f 扩大到 1000 (这是一种比例缩放 $ alpha=100 $ ):

最小化 $ frac{1}{2} (100) x^2 + (1000) x = 50 x^2 + 1000 x $
约束:$ x ge 2 $

缩放后的问题:
目标函数: $ J'(x) = 50 x^2 + 1000 x $
梯度: $ J''(x) = 100 x + 1000 $
无约束最小值在 $ 100 x + 1000 = 0 implies x = 10 $。
约束仍然是 $ x ge 2 $。
同样,最优解仍然在最接近无约束最小值的可行点上,即 $ x = 2 $。
最优解 $ x^ = 2 $。

这仍然没有体现出“完全不同”!

问题出在我的例子过于简单,只涉及一个变量和一条边界。 现实世界的二次规划是多维的,有复杂的线性等式和不等式约束,形成一个多面体可行域。

让我们回到几何解释和最优性条件,特别是 KarushKuhnTucker (KKT) 条件。

对于带有约束的 QP 问题,最优解 $ mathbf{x}^ $ 必须满足 KKT 条件,其中包括:
1. Stationarity (平稳性): $ abla J(mathbf{x}^) + lambda_{eq}^T mathbf{A}_{eq}^T + lambda_{ub}^T mathbf{A}_{ub}^T = mathbf{0} $ (这里 $ lambda $ 是拉格朗日乘子)
2. Primal Feasibility (原可行性): 满足所有 $ mathbf{x} $ 的约束。
3. Dual Feasibility (对偶可行性): 对不等式约束的拉格朗日乘子 $ lambda_{ub} ge 0 $。
4. Complementary Slackness (互补松弛性): 对于不等式约束 $ mathbf{a}_i^T mathbf{x} le b_i $,有 $ lambda_i (mathbf{a}_i^T mathbf{x} b_i) = 0 $。这意味着如果一个约束是严格满足的($ mathbf{a}_i^T mathbf{x} < b_i $),那么对应的拉格朗日乘子必须为零。如果拉格朗日乘子大于零($ lambda_i > 0 $),那么该约束必须被“激活”或“紧绷”($ mathbf{a}_i^T mathbf{x} = b_i $)。

现在,如果我们把目标函数乘以 $ alpha $ ($ alpha > 0 $):
$ J'(mathbf{x}) = alpha J(mathbf{x}) $
$ abla J'(mathbf{x}) = alpha abla J(mathbf{x}) $

KKT 条件变为:
$ alpha abla J(mathbf{x}^) + lambda'_{eq}^T mathbf{A}_{eq}^T + lambda'_{ub}^T mathbf{A}_{ub}^T = mathbf{0} $

比较一下:
原始 KKT: $ abla J(mathbf{x}^) + lambda_{eq}^T mathbf{A}_{eq}^T + lambda_{ub}^T mathbf{A}_{ub}^T = mathbf{0} $
缩放 KKT: $ alpha abla J(mathbf{x}^) + lambda'_{eq}^T mathbf{A}_{eq}^T + lambda'_{ub}^T mathbf{A}_{ub}^T = mathbf{0} $

从这里我们可以看到,为了满足缩放后的 KKT 条件,拉格朗日乘子 $ lambda $ 的值也必须发生变化。

$ alpha (mathbf{H}mathbf{x}^ + mathbf{f}) = (lambda'_{eq}^T mathbf{A}_{eq}^T + lambda'_{ub}^T mathbf{A}_{ub}^T) $

这说明,即使 $ mathbf{H} $ 和 $ mathbf{f} $ 按比例缩放,但要满足约束以及互补松弛性,新的拉格朗日乘子 $ lambda' $ 的值(以及它们激活哪些约束)很可能会改变。

这就是为什么最优解 $ mathbf{x}^ $ 会变!

改变的曲率 (H): 使得最优解在没有约束时倾向于“更陡峭”。
改变的线性趋势 (f): 使得最优解在没有约束时倾向于被“推”得更远。

当这两个因素结合,并且需要满足一组固定的线性约束时,最优解为了在满足约束的同时最小化(被放大了的)目标函数,必然需要在可行域内寻找一个不同的点。

想象一下: 你在一个有起伏的山谷里找最低点(目标函数),但你只能待在一条画好的路线上(可行域)。
如果你把整个山谷“拉高压扁”(增大 $ mathbf{H} $),路径上可能不再是原来的那个点最低。
如果你给山谷加上一个斜坡(增大 $ mathbf{f} $),最低点的位置也会移动。
当你同时做了这两件事,并且你必须沿着路走,那么最终停留的那个点(最优解)很可能和你第一次找的完全不一样。

总结一下,为什么 MATLAB 中二次规划同时扩大 H, f 会得到完全不同的结果:

1. 约束是关键: 尽管目标函数 $ J(mathbf{x}) $ 乘以一个常数 $ alpha $ 只是改变了其“高度”,但对于有约束的优化问题,最优解是目标函数在可行域内的最小值。
2. 改变了目标函数的“形状”与“趋势”的相对重要性: $ mathbf{H} $ 影响曲率(形状),$ mathbf{f} $ 影响线性趋势。同时放大它们,改变了目标函数在可行域内“倾斜”或“弯曲”的绝对程度。
3. 影响了 KKT 条件和拉格朗日乘子: 缩放后的目标函数需要不同的拉格朗日乘子来满足 KKT 条件,这直接导致了最优解 $ mathbf{x}^ $ 的位置改变。
4. 数值算法的敏感性: MATLAB 的求解器是数值算法,它们对输入数据的尺度敏感。条件的恶化(Hessian 矩阵的条件数)或算法迭代过程中的步长选择,都可能因为数值尺度的改变而导致不同的收敛点。

所以,不是说 $ mathbf{H} $ 和 $ mathbf{f} $ 本身“不应该”按比例缩放,而是这种缩放改变了问题本身的数值特征和最优性条件的平衡点,从而在有约束的情况下,引导求解器找到了另一个满足约束的最优解。这在实际应用中非常常见,比如改变权重或惩罚项的系数,都会影响优化结果。

网友意见

user avatar

hmmm,可能性很多,有可能是你的代码有bug也有可能是quadprog本身有问题。建议如下:

1. 自己创建一个超级简单的例子,比如H F都是2阶的,用quadprog解,然后用同样的操作把h和f同时放大看看会不会出现同样的问题。这样可以看出你的操作和quadprog本身是否有问题。

2. 检查一下放大前后H是不是一直是对称的。

3. 尝试用不同的solver看看。比如用interior-point. 同时看一下exitflag的信息。

类似的话题

  • 回答
    要说清楚为什么 MATLAB 中二次规划的 `H` 和 `f` 同时扩大(或者说成比例缩放)会得到“完全不同”的结果,我们需要深入到二次规划问题本身的数学结构以及 MATLAB 求解器的工作方式。首先,我们先回顾一下标准二次规划(Quadratic Programming, QP)问题的形式:最小化.............
  • 回答
    MATLAB 是一款功能强大且广泛应用于工程、科学和数学领域的软件。然而,正如任何工具一样,它也存在一些限制,这导致一些程序员对其持负面看法,甚至“鄙视”。理解这些批评的根源,需要从多个维度进行剖析。以下是导致一些程序员鄙视 MATLAB 的主要原因,我会尽量详细地阐述:1. 高昂的许可费用和封闭的.............
  • 回答
    招程序员不考虑MATLAB技能?这事儿说起来,得从几个方面掰扯清楚。其实,这个问题本身就有点“为什么不招一个同时会开飞机和潜水的人呢?”——虽然这两种技能都很厉害,但它们的应用场景和招聘需求往往并不重叠。首先,我们得明白MATLAB是什么,它擅长什么。MATLAB,全称是“Matrix Labora.............
  • 回答
    坦白说, MATLAB 的语言设计确实不是那种以“优雅”著称的典范,很多程序员,尤其是来自 C/C++、Python、Java 等背景的,初次接触时可能会觉得它有点“别扭”甚至“丑陋”。这倒不是说 MATLAB 一无是处,它的强大在于其丰富的工具箱和为科学计算优化的底层实现,但在语言本身的构造上,确.............
  • 回答
    “中国程序员工资那么高,连一个MATLAB的替代品都开发不出来”这个问题,触及了技术发展、产业生态、人才培养以及市场需求等多个层面,背后原因复杂且值得深入探讨。简单地将高薪与开发不出替代品画等号,是一种过于简化的视角。要理解这个问题,我们需要从以下几个方面进行分析:一、 中国程序员工资高是事实,但其.............
  • 回答
    你提的这个问题很有意思,也很有代表性。确实,在当前的深度学习浪潮中,当我们谈论主流的工具和框架时,Matlab的神经网络工具箱(Neural Network Toolbox,现在更名为Deep Learning Toolbox)似乎总是被排除在外,或者讨论的声音相对较弱。这背后并非没有原因,而是由多.............
  • 回答
    为什么 Matlab/NumPy/Eigen 在速度上会有如此巨大的差异? 咱们掰开了揉碎了聊聊。你是不是也遇到过这样的情况:用 Matlab 或者 NumPy 写一段矩阵运算,感觉还挺顺畅,但跑起来速度嘛……emmm,有时候真的不够看。换成 C++ 配合 Eigen 库,同样的逻辑,速度那叫一个飞.............
  • 回答
    陈平先生关于“MATLAB 为低能的客户提供方便的程序集成”的说法,是一个非常具有争议性和概括性的评价。要详细地看待这个说法,我们需要从多个角度进行分析,包括其潜在的含义、可能引发的辩论、以及对MATLAB自身及其用户群体的客观描述。一、 陈平先生说法的潜在含义和语境:首先,我们需要理解陈平先生在说.............
  • 回答
    MATLAB,这个名字本身就带着一种严谨和一丝不苟的科研气息。它不仅仅是一个编程语言,更像是一个集成了无数工具箱的强大实验室,让你可以在数字的海洋里尽情探索和创造。核心优势:从想法到实现的无缝衔接MATLAB最让我欣赏的地方在于它将“可视化”和“计算”紧密地结合在一起。你在脑海中构思一个算法,尝试用.............
  • 回答
    .......
  • 回答
    好的,我们来一起看看这段MATLAB代码,找出问题所在,并给出修改建议。我会尽量把它讲得透彻,并且用最自然的语言来表达。首先,请把你想分析的MATLAB代码提供给我。没有代码,我实在无法指出具体的问题和修改方法。等你把代码发过来后,我将从以下几个方面着手分析:1. 语法错误(Syntax Erro.............
  • 回答
    在MATLAB的世界里,`conv` 函数是进行卷积运算的得力助手。而卷积,这个在信号处理、图像处理、概率论以及许多其他领域都闪耀着光芒的数学概念,也有其经典的定义公式。理解 `conv` 函数与卷积公式之间的联系,就如同理解一把锋利的工具如何精确地执行一项严谨的数学任务。 卷积公式:数学的基石我们.............
  • 回答
    在MATLAB中,`buffer` 函数是一个非常实用的工具,尤其是在处理连续数据流、信号处理或者需要将长序列分割成固定大小的子序列时。然而,在使用 `buffer` 函数时,确实会遇到一些常见的错误,这些错误通常源于对函数参数的理解不足或数据本身不符合函数预期。下面我将详细分析这些常见错误及其原因.............
  • 回答
    我脑海里最美的 MATLAB 绘图,与其说是一张静态的图片,不如说是一种动态的、充满生命力的“表演”。那是一个关于“混沌”的视觉化呈现,具体来说,是洛伦兹吸引子(Lorenz Attractor)的三维动态模拟。当时我正在学习动力学系统,老师在讲座中展示了这段代码运行的效果。那不是简单的折线图,也不.............
  • 回答
    好的,我们来详细地分析一下在MATLAB中生成一个10行10列的矩阵,要求每行每列都恰好有3个1,其余元素为0的矩阵有多少个。这个问题实际上是在问一个组合数学问题:在一个10x10的网格(矩阵)中,选择多少种方式可以放置100个元素(0或1),使得每一行恰好有3个1,每一列也恰好有3个1。理解问题 .............
  • 回答
    近年来,自由主义在全球范围内的影响力确实呈现出明显的衰落趋势,这一现象涉及经济、政治、社会、技术、文化等多个层面的复杂互动。以下从多个维度详细分析自由主义衰落的原因: 一、经济全球化与贫富差距的加剧1. 自由主义经济政策的局限性 自由主义经济学强调市场自由、私有化、减少政府干预,但其在21世.............
  • 回答
    俄乌战争期间,虚假信息(假消息)的传播确实非常广泛,其背后涉及复杂的国际政治、媒体运作、技术手段和信息战策略。以下从多个角度详细分析这一现象的成因: 1. 信息战的直接动因:大国博弈与战略竞争俄乌战争本质上是俄罗斯与西方国家(尤其是美国、北约)之间的地缘政治冲突,双方在信息领域展开激烈竞争: 俄罗斯.............
  • 回答
    政府与军队之间的关系是一个复杂的政治与军事体系问题,其核心在于权力的合法性和制度性约束。虽然政府本身可能不直接持有武器,但通过法律、组织结构、意识形态和历史传统,政府能够有效指挥拥有武器的军队。以下是详细分析: 一、法律授权与国家主权1. 宪法与法律框架 政府的权力来源于国家宪法或法律。例如.............
  • 回答
    关于“传武就是杀人技”的说法,这一观点在历史、文化和社会语境中存在一定的误解和偏见。以下从历史、文化、现代演变和误解来源等多个角度进行详细分析: 一、历史背景:武术的原始功能与社会角色1. 自卫与生存需求 中国传统武术(传武)的起源与农耕社会、游牧民族的生存环境密切相关。在古代,武术的核心功.............
  • 回答
    关于近代历史人物是否能够“翻案”的问题,需要结合历史背景、人物行为对国家和民族的影响,以及历史评价的客观性进行分析。袁世凯和汪精卫作为中国近代史上的重要人物,其历史评价确实存在复杂性和争议性,但“不能翻案”的结论并非基于单一因素,而是综合历史、政治、道德等多方面考量的结果。以下从历史背景、人物行为、.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有