大数据机器学习算法与计算机视觉应用02:线性规划
Linear Programming
- Definition of linear programming
- max and min-cost max flow
- linear program to solve minimax optimal strategies in games
- Algoithms for linear programming
- l1 regression
- Seidel’s 2-dimensional linear programming algorithm
linear program 线性规划
线性规划包含以下几个特征:
- 包含 n n n个变量 x 1 , x 2 , ⋯ , x n x_1,x_2,\cdots,x_n x1,x2,⋯,xn
- 所有的限制条件都是变量的线性组合
- 目标函数也是这些变量的线性组合并且求最大值
- 没有乘积
所有的限制条件都满足是大于等于(小于等于)的话,这个线性规划称为是有边界的,否则就是没有边界的。
对于一些没有边界的线性规划,目标函数可能没有最大值。
max and min-cost max flow最大流
Modeling Network Flow
网络流模型是一种常见的算法模型,其主要包含以下几个组成部分:
- 变量:对于每条边 ( u , v ) (u,v) (u,v), f u v f_{uv} fuv表示这条边的流的大小
- 目标:最大化最终节点 T T T接收到的流
- 限制条件:
- 每条边上的流不能超过这条边的承载能力(每条边上的流存在最大值)
- 除了源点 S S S和最终节点 T T T之外,其他节点进入的流量总和等于输出的流量总和。
一个例子如下:
min-cost max flow 最小开销最大流
每条边 ( u , v ) (u,v) (u,v)都有一个最大负载 c ( u , v ) c(u,v) c(u,v)和成本 w ( u , v ) w(u,v) w(u,v),目标则是设法让每条边流量和单位成本的乘积总和最小,也就是
min ∑ ( u , v ) ∈ E w ( u , v ) f u v \min \sum\limits_{(u,v)\in E}^ {} w(u,v)f_{uv} min(u,v)∈E∑w(u,v)fuv
这个问题如何解决呢?
第一种方法:先求最大流 f f f,然后优化目标函数。
第二种方法:连接终点和源点 ( T , S ) (T,S) (T,S)并让这条边的单位成本为一个很大的负值,这样计算目标函数的同时就保证了最大流。
review: Zero Sum Game
之前的零和博弈和我们刚刚的最大流问题有点相似。他们都有如下的共同点:
变量:一堆变量说明:在零和博弈中是执行各种动作的概率,在最大流问题中是每条边的流量。
目标:都是变量的线性组合。在零和博弈中,是概率和对应收益乘积的总和(收益给定),在最大流问题中,是通往终点所有流量的总和。
约束条件:也是变量的线性组合。
Linear Program to solve minimax optimal strategies in games
线性规划的一般形式如下:
目标函数: c ⃗ T X ⃗ \vec{c}^T\vec{X} cTX
约束条件: A X ⃗ ≤ b A\vec{X} \leq b AX≤b
每个约束条件都将变量的向量空间的超平面分割成两个半平面,多个半平面的交集被称为可行域。
如果可行域是空集,说明该线性规划是不可行的。线性规划可以是没有边界的,但是一般都是可行的,否则目标函数无解。
一般来说,可行域都是一个凸集。这保证可行域一般只有唯一解。
Algorithms for Linear Programming
常见的线性规划算法包括:
- Simplex Algorithm 单纯形法:这种方法简单使用,但是在最坏情况下需要指数时间复杂度。
- Ellipsoid Algorithm 椭球算法:具有多项式的时间复杂度,但是实际运行较慢
- Karmarkar’s Algorithm(interior point) 卡马卡算法:同样多项式的时间复杂度,而且运行较快
这里不做详细算法解释,只做大致介绍。
Simplex Algorithm
单纯形法从可行域的一个顶点开始,依次和附近的点比较,如果发现新的最大值,就进行迁移。
Ellipsoid algorithm
椭球算法将目标函数替换为一个约束条件,并且使用二分查找方法。
Karmarkar’s algorithm
卡马卡方法又被称作内部点方法,它寻找最优解的方法并非从可行域边界的一个顶点出发,而是从可行域内部的一个点开始。
L1 Regression
线性回归是另外一种形式的线性规划,它的背景是求解向量方程 A x ⃗ = b ⃗ \mathbf{A}\vec{x} = \vec{b} Ax=b
在许多情况下,这个方程是没有精确解的,这个时候我们转而去计算最接近的解,也就是要求
min Σ i = 1 , … , n ∣ A x ⃗ − b ⃗ ∣ \min\Sigma_{i=1,\dots,n}|\mathbf{A}\vec{x}-\vec{b}| minΣi=1,…,n∣Ax−b∣对应的 x ⃗ \vec{x} x。
为什么这是一种线性规划?
我们可以将线性回归视作如下表述:对 A \mathbf{A} A的每一行 A i \mathbf{A_i} Ai,都有约束条件
A i x ⃗ − b i ≤ s i \mathbf{A_i}\vec{x}-b_i \leq s_i Aix−bi≤si
和
A i x ⃗ − b i ≥ − s i \mathbf{A_i}\vec{x}-b_i \geq -s_i Aix−bi≥−si
目标函数则是求
min Σ i = 1 , … , n s i \min \Sigma_{i=1,\dots,n}s_i minΣi=1,…,nsi
对于线性回归问题,我们一般使用的是最小二乘法,这里不再赘述了。
Seidel’s 2-dimensional linear programming algorithm
在解决一个二维线性规划问题时,以下的一个算法可以作为参考:
假设约束条件是 a i x ∗ ⃗ ≤ b i a_i\vec{x^*}\leq b_i aix∗≤bi
我们递归寻找 a 2 x ∗ ⃗ ≤ b 2 , … , a m x ∗ ⃗ ≤ b m a_2\vec{x^*}\leq b_2,\dots,a_m\vec{x^*}\leq b_m a2x∗≤b2,…,amx∗≤bm的对应最优解。
接下来,对应 a 1 a_1 a1有两种情况:
- 先前的最优解满足新的约束条件,那么先前的最优解就是整体最优解,时间复杂度很明显是 O ( 1 ) O(1) O(1);
- 新的约束条件给出了新的最优解。这个时候需要计算新的最优解,遍历新的约束条件和先前 m − 1 m-1 m−1个约束条件的交点依次计算是否最优,时间复杂度是 O ( m ) O(m) O(m)
那么这个算法总共的时间复杂度满足:
T ( m ) = T ( m − 1 ) + O ( m ) T(m) = T(m-1)+O(m) T(m)=T(m−1)+O(m)
可得该算法的最坏时间复杂度是 O ( m 2 ) O(m^2) O(m2)。
我们能不能优化以下,让这个算法的期望时间复杂度变为 O ( m ) O(m) O(m)呢?这就是Seidel算法。
(注意,这里的算法一般不指代高斯-赛德尔迭代法,后者一般用于运动学求数值解)。
Seidel’s Algorithm 非常简单,就是在随机排列上述的约束条件后进行相同的递归算法。那么,为什么随机排布一下之后,这个算法的期望时间复杂度就变成了 O ( m ) O(m) O(m)呢?原因就是,随机排布之后,第二种遍历的情况大大减少了。
我们知道最优解一定在两条约束条件 a i , a j a_i,a_j ai,aj的交点上,那么其中一个在最新的这一步出现的概率是多少呢?
很明显概率是:
2 × ( m − 1 ) ! ( m ) ! = 2 m 2 \times \frac{(m-1)!}{(m)!} = \frac{2}{m} 2×(m)!(m−1)!=m2
因此每步递归的期望时间复杂度为:
( 1 − 2 m ) O ( 1 ) + 2 m O ( m ) = O ( 1 ) (1-\frac{2}{m})O(1) + \frac{2}{m}O(m) = O(1) (1−m2)O(1)+m2O(m)=O(1)
总算法的期望时间复杂度为:
T ( m ) = T ( m − 1 ) + O ( 1 ) T ( m ) = O ( m ) T(m) = T(m-1) + O(1) T(m) = O(m) T(m)=T(m−1)+O(1)T(m)=O(m)
相关文章:

大数据机器学习算法与计算机视觉应用02:线性规划
Linear Programming Definition of linear programmingmax and min-cost max flowlinear program to solve minimax optimal strategies in gamesAlgoithms for linear programmingl1 regressionSeidel’s 2-dimensional linear programming algorithm linear program 线性规…...

godot——主题、Theme、StyleBox
我刚开始被这些术语吓到了,一直不敢去接触它们,都用的默认样式。现在好不容易有点思路了,记录下来。 下面看看怎么自定义样式。 1.先新建一个Theme 2.再次点击创建好的Theme 得到 图1 这样一个面板。(看不懂没事,继…...

深入理解接口测试:实用指南与最佳实践5.0(一)
✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_63815035/cat…...

SQL面试题——飞猪SQL面试 重点用户
飞猪SQL面试题—重点用户 在一些场景中我们经常听到这样的一些描述,例如20%的用户贡献了80%的销售额,或者是20%的人拥有着80%的财富,你知道这样的数据是怎么算出来的吗 数据如下,uid 是用户的id ,amount是用户的消费金额 |uid|amount| ---…...

Angular 和 Vue2.0 对比
前言 :“业精于勤,荒于嬉;行成于思,毁于随” 很久没写博客了,大多记录少进一步探查。 Angular 和 Vue2.0 对比: 一.概念 1.1 Angular 框架: 是一款由谷歌开发的开源web前端框架(核…...
websocket服务器(协程风格)--swoole进阶篇
swoole的websocket服务器(协程风格)示例真不算友善,从头了解到尾,那还好,但是谁有那么多时间从头到尾了解。示例不够针对性,写websocket就该单独写websocket的东西,偏偏又加上http的东西。这里我来解读一下websocket服务器(协程风格)示例 <?php use Swoole\Http\…...

Windows C/C++ Socket 编程
承接上文:socket 编程 本文目录 Windows Client 端WSADATA 结构体WSAStartup() 函数SOCKET 以及 socket() 函数sockaddr_ininet_pton() 函数in_addr structmemcpy()connect() 函数send() 函数recv() 函数 Windows Server 端 在进行 socket 编程之前,你要…...

计算两个结构的乘法
在行列可自由变换的平面上,2点结构有3个 3点结构有6个 计算2*2 2a1*2a14a6 2a1*2a24a8 2a1*2a34a12 显然2a1*2a14a6因为这3个结构都分布在同一列上,就是整数乘法。2a1*2a2的结果有2种写法,一种外形像2a1细节为2a2,一种外形为2…...

学校服务器连接pycharm配置2
上一个可能还是有点问题,因为实际在跑的时候读取的其实是本地的anaconda,这个重新整了一下流程 首先在学校服务器先激活自己创建的虚拟环境,这里就不截图了 然后在pycharm里面打开设置 选择这个python解释器 这里有添加解释器 选择SSH …...
AI赋能电商:创新应用提升销售与用户体验
目录 一、引言 二、AI技术在电商领域的创新应用 三、AI技术提高电商销售效率和用户体验的实践路径 一、引言 随着人工智能(AI)技术的不断成熟,电商行业正迎来一场深刻的变革。AI技术在购物推荐、会员分类、商品定价等方面的创新应用&…...
详解kafka消息发送重试机制的案例
在 Kafka 生产者中实现消息发送的重试机制,可以通过配置 KafkaProducer 的相关属性来实现。以下是一些关键的配置项: retries:设置生产者发送失败后重试的次数。 retry.backoff.ms:设置生产者在重试前等待的时间。 buffer.memo…...
linux文本管理!!!
文章目录 第1章 文本过滤/查看命令1.echo:输出文本2.cat:合并文件或查看文件内容3.head:显示文件头部信息4.tail:显示文件尾部信息5.wc: 统计文本行号6.less:分页显示文件内容7.grep:文本过滤工具8.定向符号…...
软件设计师-计算机体系结构分类
计算机体系结构分类 Flynn分类法 根据不同的指令流数据流组织方式分类单指令流但数据流SISD,单处理器系统单指令多数据流SIMD,单指令流多数据流是一种采用一个控制器来控制多个处理器,同时对一组数据(又称“数据矢量”)中的每一…...

《基于深度学习的车辆行驶三维环境双目感知方法研究》
复原论文思路: 《基于深度学习的车辆行驶三维环境双目感知方法研究》 1、双目测距的原理 按照上述公式算的话,求d的话,只和xl-xr有关系,这样一来,是不是只要两张图像上一个测试点的像素位置确定,对应的深…...

jwt用户登录,网关给微服务传递用户信息,以及微服务间feign调用传递用户信息
1、引入jwt依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency> 2、Jwt工具类,生成token以及解析token package com.niuniu.gateway.uti…...

ubontu安装anaconda
1.下载 Anaconda 安装脚本 2. 复制到服务器上/home/username文件夹中,进入文件夹,执行: bash Anaconda3-2024.10-1-Linux-x86_64.sh一直按回车,然后输入yes同意协议。 3. 初始化 Anaconda 环境,会自动配置环境变量&a…...

【Docker容器化技术】docker安装与配置、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
文章目录 一、Docker的安装与配置1、docker概述2、安装docker3、docker架构4、配置镜像加速器 二、Docker命令1、服务相关命令2、镜像相关命令3、容器相关命令 三、Docker容器数据卷1、数据卷概念及作用2、配置数据卷3、配置数据卷容器 四、Docker应用部署实战1、部署MySQL2、部…...
Python模拟A卷实操题
1.某机械公司生产两种产品。A的单件利润分别是100元,B的单件利润是150元。 每种产品由三种材料构成,现给出每种材料的库存(库存小于100000),求利润最大的生产方案。输入说明:第一行给出生产每件A产品所需要…...
Leetcode 检测相邻递增子数组
3349. 检测相邻递增子数组 I 给你一个由 n 个整数组成的数组 nums ,请你找出 k 的 最大值,使得存在 两个 相邻 且长度为 k 的 严格递增 子数组 。具体来说,需要检查是否存在从下标 a 和 b (a < b) 开始的 两个 子数组,并满…...
rockylinux 8安装 gcc11.2
方法 1:从源代码编译安装最新版本的 GCC 下载 GCC 源代码: 访问 GCC 官方网站下载最新版本的源代码,例如: wget https://ftp.gnu.org/gnu/gcc/gcc-11.2.0/gcc-11.2.0.tar.gz tar -xf gcc-11.2.0.tar.gz cd gcc-11.2.0安装依赖项&a…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...