什么是凸函数及如何判断一个函数是否是凸函数

一、什么是凸函数

 对于一元函数\(f(x\)),如果对于任意\(t\epsilon[0,1]\)均满足:\(f(tx_1 + (1-t)x_2) \leq tf(x_1) + (1-t)f(x_2)\),则称\(f(x)\)为凸函数(convex function)

 如果对于任意\(t\epsilon(0,1)\)均满足:\(f(tx_1 + (1-t)x_2) < tf(x_1) + (1-t)f(x_2)\),则称\(f(x)\)为严格凸函数(convex function)

 我们可以从几何上直观地理解凸函数的特点,凸函数的割线在函数曲线的上方,如图1所示:

 上面的公式,完全可以推广到多元函数。在数据科学的模型求解中,如果优化的目标函数是凸函数,则局部极小值就是全局最小值。这也意味着我们求得的模型是全局最优的,不会陷入到局部最优值。例如支持向量机的目标函数\(||w||^2/2\)就是一个凸函数。

二、如何来判断一个函数是否是凸函数呢?

 对于一元函数\(f(x)\),我们可以通过其二阶导数\(f‘‘(x)\) 的符号来判断。如果函数的二阶导数总是非负,即\(f‘‘(x) \geq 0\) ,则\(f(x)\)是凸函数

 对于多元函数\(f(X)\),我们可以通过其Hessian矩阵(Hessian矩阵是由多元函数的二阶导数组成的方阵)的正定性来判断。如果Hessian矩阵是半正定矩阵,则是\(f(X)\)凸函数

三、Jensen不等式

 对于凸函数,我们可以推广出一个重要的不等式,即Jensen不等式。如果 f 是凸函数,X是随机变量,那么\(f(E(X)) \leq  E(f(X))\),上式就是Jensen不等式的一般形式

 我们还可以看它的另一种描述。假设有 n 个样本\(\{x_1,x_2,...,x_n\}\)和对应的权重\(\{\alpha_1,\alpha_2,...,\alpha_n\}\),权重满足\(a_i \geqslant 0,\sum\alpha_i = 1\),对于凸函数 f,以下不等式成立:

\(f(\sum_{i=1}^{n}\alpha_ix_i) \leq \sum_{i=1}^{n}\alpha_if(x_i)\)

原文地址:https://www.cnblogs.com/always-fight/p/9377554.html

时间: 2024-08-03 12:11:03

什么是凸函数及如何判断一个函数是否是凸函数的相关文章

new.target元属性 | 分别用es5、es6 判断一个函数是否使用new操作符

函数内部有两个方法 [[call]] 和 [[construct]] (箭头函数没有这个方法),当使用new 操作符时, 函数内部调用 [[construct]], 创建一个新实例,this指向这个实例: 不使用new 操作符时, 函数内部调用 [[call]]. 判断一个函数是否使用new操作符,ES5的方法: function Person(name) { if (this instanceof Person) { this.name = name; } else { throw new E

判断一个函数是否有参数传递进来

第一种方法: 第二种方法: 原文地址:http://blog.51cto.com/11871779/2118109

c语言:实现一个函数,判断一个数是不是素数。

实现一个函数,判断一个数是不是素数. 程序: #include <stdio.h> #include <math.h> int prime(int num) //prime表示素数 { int i = 0; int k = 0; k = sqrt(num); for (i = 2; i <= k; i++) { if (num%i == 0) { return 0; } } return 1; } int main() { int num; int ret; printf(&

c语言:实现一个函数判断year是不是润年。

实现一个函数判断year是不是润年. 程序: #include<stdio.h> int leap_year(int year)//leap year 闰年 { if ((year % 4 == 0 && year / 100 != 0) || (year % 400 == 0)) { return 1; } else { return 0; } } int main() { int year; int ret = 0; printf("请输入年份:");

求一个整型数字中有没有相同的部分,例如12386123这个整型数字中相同的部分是123,相同的部分至少应该是2位数,如果有相同部分返回1,如果没有则返回0。方法是先将整型数字转换到数组中,再判断。函数为 int same(int num)其中num是输入的整型数字

import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Test { public static void main(String[] args) { /** * 2.求一个整型数字中有没有相同的部分,例如12386123这个整型数字中相同的部分是123, * 相同的部分至少应该是2位数,如果有相同部分返回1,如果没有则返回0. * 方法是先将整型数字转换到数组中,再判断.

编写一个函数isMerge,判断一个字符串str是否可以由其他两个字符串part1和part2“组合”而成

编写一个函数isMerge,判断一个字符串str是否可以由其他两个字符串part1和part2“组合”而成.“组合 ”的规则如下: 1). str中的每个字母要么来自于part1,要么来自于part2; 2). part1和part2中字母的顺序与str中字母的顺序相同. 例如: "codewars"由"cdw"和"oears"组合而成: s: c o d e w a r s = codewars part1: c d w = cdw part2

PHP如何判断一个数组是一维数组或者是二维数组?用什么函数?

如题:如何判断一个数组是一维数组或者是二维数组?用什么函数? 判断数量即可 <?php if (count($array) == count($array, 1)) { echo '是一维数组'; } else { echo '不是一维数组'; } PHP手册: int count ( mixed $var [, int $mode ] )  --  计算数组中的单元数目或对象中的属性个数  如果可选的 mode 参数设为 COUNT_RECURSIVE(或 1),count() 将递归地对数组

【二】在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否函数该整数。 ```java public class Test { /** 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否函数该整数. public class Test { /** 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否函数该整数. */ public static void main(String[] args) { int[][] arr =

python中一个函数实现读写文件、判断价格正确常用函数

# 写一个函数,有2个功能,能读文件,也能写文件 # 读文件,只需要传文件名 # 写文件,需要传文件名,写入的内容 import json def op_file(file, content=None): if content: with open(file, 'w', encoding='utf-8') as fw: json.dump(content, fw) else: with open(file, encoding='utf-8') as fw: result = json.load(