optimtool 2.6.2__tar.gz → 2.7.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {optimtool-2.6.2 → optimtool-2.7.1}/PKG-INFO +69 -45
- {optimtool-2.6.2 → optimtool-2.7.1}/README.md +68 -44
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool/__init__.py +1 -1
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool/_version.py +1 -1
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool/unconstrain/gradient_descent.py +1 -1
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool/unconstrain/newton_quasi.py +11 -13
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool/unconstrain/nonlinear_least_square.py +145 -145
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool/unconstrain/trust_region.py +5 -5
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool.egg-info/PKG-INFO +69 -45
- {optimtool-2.6.2 → optimtool-2.7.1}/setup.py +1 -1
- {optimtool-2.6.2 → optimtool-2.7.1}/LICENSE +0 -0
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool/_convert.py +0 -0
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool/_drive.py +0 -0
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool/_kernel.py +0 -0
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool/_proxim.py +0 -0
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool/_search.py +0 -0
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool/_typing.py +0 -0
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool/_utils.py +0 -0
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool/base.py +0 -0
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool/constrain/__init__.py +0 -0
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool/constrain/equal.py +0 -0
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool/constrain/mixequal.py +0 -0
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool/constrain/unequal.py +0 -0
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool/example/Lasso.py +0 -0
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool/example/WanYuan.py +0 -0
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool/example/__init__.py +0 -0
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool/hybrid/__init__.py +0 -0
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool/hybrid/approt.py +0 -0
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool/hybrid/fista.py +0 -0
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool/hybrid/nesterov.py +0 -0
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool/unconstrain/__init__.py +0 -0
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool/unconstrain/newton.py +0 -0
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool.egg-info/SOURCES.txt +0 -0
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool.egg-info/dependency_links.txt +0 -0
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool.egg-info/not-zip-safe +0 -0
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool.egg-info/requires.txt +0 -0
- {optimtool-2.6.2 → optimtool-2.7.1}/optimtool.egg-info/top_level.txt +0 -0
- {optimtool-2.6.2 → optimtool-2.7.1}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: optimtool
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.7.1
|
|
4
4
|
Summary: The fundamental package for scientific research in optimization.
|
|
5
5
|
Home-page: https://github.com/linjing-lab/optimtool
|
|
6
6
|
Download-URL: https://github.com/linjing-lab/optimtool/tags
|
|
@@ -70,6 +70,30 @@ pip install -e . --verbose
|
|
|
70
70
|
```text
|
|
71
71
|
pip install optimtool --upgrade
|
|
72
72
|
```
|
|
73
|
+
下载没有更改库架构的版本:
|
|
74
|
+
```text
|
|
75
|
+
pip install optimtool==2.3.5
|
|
76
|
+
```
|
|
77
|
+
下载优化库架构并增加typing变量的版本:
|
|
78
|
+
```text
|
|
79
|
+
pip install optimtool>=2.4.0
|
|
80
|
+
```
|
|
81
|
+
下载改进h2h函数的版本:
|
|
82
|
+
```text
|
|
83
|
+
pip install optimtool>=2.4.2
|
|
84
|
+
```
|
|
85
|
+
下载增强文档表达和检测非法输入的版本:
|
|
86
|
+
```text
|
|
87
|
+
pip install optimtool>=2.5.0rc0
|
|
88
|
+
```
|
|
89
|
+
下载支持hybrid算法的版本:
|
|
90
|
+
```text
|
|
91
|
+
pip install optimtool>=2.5.0
|
|
92
|
+
```
|
|
93
|
+
下载更好地支持numpy的版本:
|
|
94
|
+
```text
|
|
95
|
+
pip install optimtool>=2.6.0
|
|
96
|
+
```
|
|
73
97
|
## 项目结构
|
|
74
98
|
|
|
75
99
|
```textile
|
|
@@ -125,10 +149,10 @@ ou.[方法名].[函数名]([目标函数], [参数表], [初始迭代点])
|
|
|
125
149
|
ou.gradient_descent.[函数名]([目标函数], [参数表], [初始迭代点])
|
|
126
150
|
```
|
|
127
151
|
|
|
128
|
-
| 方法头
|
|
129
|
-
|
|
|
130
|
-
| solve(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, epsilon: float=1e-10, k: int=0) -> OutputType
|
|
131
|
-
| steepest(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="wolfe", epsilon: float=1e-10, k: int=0) -> OutputType
|
|
152
|
+
| 方法头 | 解释 |
|
|
153
|
+
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- |
|
|
154
|
+
| solve(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, epsilon: float=1e-10, k: int=0) -> OutputType | 通过解方程的方式来求解精确步长 |
|
|
155
|
+
| steepest(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="wolfe", epsilon: float=1e-10, k: int=0) -> OutputType | 使用线搜索方法求解非精确步长(默认使用wolfe线搜索) |
|
|
132
156
|
| barzilar_borwein(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="Grippo", c1: float=0.6, beta: float=0.6, M: int=20, eta: float=0.6, alpha: float=1., epsilon: float=1e-10, k: int=0) -> OutputType | 使用Grippo与ZhangHanger提出的非单调线搜索方法更新步长 |
|
|
133
157
|
|
|
134
158
|
#### 牛顿法(newton)
|
|
@@ -137,11 +161,11 @@ ou.gradient_descent.[函数名]([目标函数], [参数表], [初始迭代点])
|
|
|
137
161
|
ou.newton.[函数名]([目标函数], [参数表], [初始迭代点])
|
|
138
162
|
```
|
|
139
163
|
|
|
140
|
-
| 方法头
|
|
141
|
-
|
|
|
142
|
-
| classic(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, epsilon: float=1e-10, k: int=0) -> OutputType
|
|
143
|
-
| modified(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="wolfe", epsilon: float=1e-10, k: int=0) -> OutputType
|
|
144
|
-
| CG(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="wolfe", eps: float=1e-3, epsilon: float=1e-6, k: int=0) -> OutputType
|
|
164
|
+
| 方法头 | 解释 |
|
|
165
|
+
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ |
|
|
166
|
+
| classic(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, epsilon: float=1e-10, k: int=0) -> OutputType | 通过直接对目标函数二阶导矩阵(海瑟矩阵)进行求逆来获取下一步的步长 |
|
|
167
|
+
| modified(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="wolfe", epsilon: float=1e-10, k: int=0) -> OutputType | 修正当前海瑟矩阵保证其正定性(目前只接入了一种修正方法) |
|
|
168
|
+
| CG(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="wolfe", eps: float=1e-3, epsilon: float=1e-6, k: int=0) -> OutputType | 采用牛顿-共轭梯度法求解梯度(非精确牛顿法的一种) |
|
|
145
169
|
|
|
146
170
|
#### 拟牛顿法(newton_quasi)
|
|
147
171
|
|
|
@@ -149,10 +173,10 @@ ou.newton.[函数名]([目标函数], [参数表], [初始迭代点])
|
|
|
149
173
|
ou.newton_quasi.[函数名]([目标函数], [参数表], [初始迭代点])
|
|
150
174
|
```
|
|
151
175
|
|
|
152
|
-
| 方法头
|
|
153
|
-
|
|
|
154
|
-
| bfgs(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="wolfe", epsilon: float=1e-10, k: int=0) -> OutputType
|
|
155
|
-
| dfp(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="wolfe", epsilon: float=1e-10, k: int=0) -> OutputType
|
|
176
|
+
| 方法头 | 解释 |
|
|
177
|
+
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------- |
|
|
178
|
+
| bfgs(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="wolfe", epsilon: float=1e-10, k: int=0) -> OutputType | BFGS方法更新海瑟矩阵 |
|
|
179
|
+
| dfp(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="wolfe", epsilon: float=1e-10, k: int=0) -> OutputType | DFP方法更新海瑟矩阵 |
|
|
156
180
|
| L_BFGS(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="wolfe", m: int=6, epsilon: float=1e-10, k: int=0) -> OutputType | 双循环方法更新BFGS海瑟矩阵 |
|
|
157
181
|
|
|
158
182
|
#### 非线性最小二乘法(nonlinear_least_square)
|
|
@@ -160,10 +184,10 @@ ou.newton_quasi.[函数名]([目标函数], [参数表], [初始迭代点])
|
|
|
160
184
|
```python
|
|
161
185
|
ou.nonlinear_least_square.[函数名]([目标函数], [参数表], [初始迭代点])
|
|
162
186
|
```
|
|
163
|
-
| 方法头
|
|
164
|
-
|
|
|
165
|
-
| gauss_newton(funcr: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False,, draw: bool=True, output_f: bool=False, method: str="wolfe", epsilon: float=1e-10, k: int=0) -> OutputType
|
|
166
|
-
| levenberg_marquardt(funcr: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, lamk: float=1., eta: float=0.2, p1: float=0.4, p2: float=0.9, gamma1: float=0.7, gamma2: float=1.3, epsk: float=1e-6, epsilon: float=1e-10, k: int=0) -> OutputType | Levenberg Marquardt提出的方法框架
|
|
187
|
+
| 方法头 | 解释 |
|
|
188
|
+
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------- |
|
|
189
|
+
| gauss_newton(funcr: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False,, draw: bool=True, output_f: bool=False, method: str="wolfe", epsilon: float=1e-10, k: int=0) -> OutputType | 高斯-牛顿提出的方法框架,包括OR分解等操作 |
|
|
190
|
+
| levenberg_marquardt(funcr: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, lamk: float=1., eta: float=0.2, p1: float=0.4, p2: float=0.9, gamma1: float=0.7, gamma2: float=1.3, epsk: float=1e-6, epsilon: float=1e-10, k: int=0) -> OutputType | Levenberg Marquardt提出的方法框架 |
|
|
167
191
|
|
|
168
192
|
#### 信赖域方法(trust_region)
|
|
169
193
|
|
|
@@ -171,8 +195,8 @@ ou.nonlinear_least_square.[函数名]([目标函数], [参数表], [初始迭代
|
|
|
171
195
|
ou.trust_region.[函数名]([目标函数], [参数表], [初始迭代点])
|
|
172
196
|
```
|
|
173
197
|
|
|
174
|
-
| 方法头
|
|
175
|
-
|
|
|
198
|
+
| 方法头 | 解释 |
|
|
199
|
+
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------- |
|
|
176
200
|
| steihaug_CG(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, r0: float=1., rmax: float=2., eta: float=0.2, p1: float=0.4, p2: float=0.6, gamma1: float=0.5, gamma2: float=1.5, epsk: float=1e-6, epsilon: float=1e-6, k: int=0) -> OutputType | 截断共轭梯度法在此方法中被用于搜索步长 |
|
|
177
201
|
|
|
178
202
|
### 约束优化算法(constrain)
|
|
@@ -188,9 +212,9 @@ oc.[方法名].[函数名]([目标函数], [参数表], [等式约束表], [不
|
|
|
188
212
|
oc.equal.[函数名]([目标函数], [参数表], [等式约束表], [初始迭代点])
|
|
189
213
|
```
|
|
190
214
|
|
|
191
|
-
| 方法头
|
|
192
|
-
|
|
|
193
|
-
| penalty_quadratice(funcs: FuncArray, args: FuncArray, cons: FuncArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="newton", sigma: float=10., p: float=2., epsk: float=1e-4, epsilon: float=1e-
|
|
215
|
+
| 方法头 | 解释 |
|
|
216
|
+
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ |
|
|
217
|
+
| penalty_quadratice(funcs: FuncArray, args: FuncArray, cons: FuncArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="newton", sigma: float=10., p: float=2., epsk: float=1e-4, epsilon: float=1e-6, k: int=0) -> OutputType | 增加二次罚项 |
|
|
194
218
|
| lagrange_augmentede(funcs: FuncArray, args: ArgArray, cons: FuncArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="newton", lamk: float=6., sigma: float=10., p: float=2., etak: float=1e-4, epsilon: float=1e-6, k: int=0) -> OutputType | 增广拉格朗日乘子法 |
|
|
195
219
|
|
|
196
220
|
#### 不等式约束(unequal)
|
|
@@ -199,9 +223,9 @@ oc.equal.[函数名]([目标函数], [参数表], [等式约束表], [初始迭
|
|
|
199
223
|
oc.unequal.[函数名]([目标函数], [参数表], [不等式约束表], [初始迭代点])
|
|
200
224
|
```
|
|
201
225
|
|
|
202
|
-
| 方法头
|
|
203
|
-
|
|
|
204
|
-
| penalty_quadraticu(funcs: FuncArray, args: ArgArray, cons: FuncArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="newton", sigma: float=10., p: float=0.4, epsk: float=1e-4, epsilon: float=1e-
|
|
226
|
+
| 方法头 | 解释 |
|
|
227
|
+
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------ |
|
|
228
|
+
| penalty_quadraticu(funcs: FuncArray, args: ArgArray, cons: FuncArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="newton", sigma: float=10., p: float=0.4, epsk: float=1e-4, epsilon: float=1e-6, k: int=0) -> OutputType | 增加二次罚项 |
|
|
205
229
|
| lagrange_augmentedu(funcs: FuncArray, args: ArgArray, cons: FuncArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="newton", muk: float=10., sigma: float=8., alpha: float=0.2, beta: float=0.7, p: float=2., eta: float=1e-1, epsilon: float=1e-4, k: int=0) -> OutputType | 增广拉格朗日乘子法 |
|
|
206
230
|
|
|
207
231
|
#### 混合等式约束(mixequal)
|
|
@@ -210,10 +234,10 @@ oc.unequal.[函数名]([目标函数], [参数表], [不等式约束表], [初
|
|
|
210
234
|
oc.mixequal.[函数名]([目标函数], [参数表], [等式约束表], [不等式约束表], [初始迭代点])
|
|
211
235
|
```
|
|
212
236
|
|
|
213
|
-
| 方法头
|
|
214
|
-
|
|
|
215
|
-
| penalty_quadraticm(funcs: FuncArray, args: ArgArray, cons_equal: FuncArray, cons_unequal: FuncArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="newton", sigma: float=10., p: float=0.6, epsk: float=1e-6, epsilon: float=1e-10, k: int=0) -> OutputType
|
|
216
|
-
| penalty_L1(funcs: FuncArray, args: ArgArray, cons_equal: FuncArray, cons_unequal: FuncArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="newton", sigma: float=1., p: float=0.6, epsk: float=1e-6, epsilon: float=1e-10, k: int=0) -> OutputType
|
|
237
|
+
| 方法头 | 解释 |
|
|
238
|
+
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------ |
|
|
239
|
+
| penalty_quadraticm(funcs: FuncArray, args: ArgArray, cons_equal: FuncArray, cons_unequal: FuncArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="newton", sigma: float=10., p: float=0.6, epsk: float=1e-6, epsilon: float=1e-10, k: int=0) -> OutputType | 增加二次罚项 |
|
|
240
|
+
| penalty_L1(funcs: FuncArray, args: ArgArray, cons_equal: FuncArray, cons_unequal: FuncArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="newton", sigma: float=1., p: float=0.6, epsk: float=1e-6, epsilon: float=1e-10, k: int=0) -> OutputType | L1精确罚函数法 |
|
|
217
241
|
| lagrange_augmentedm(funcs: FuncArray, args: ArgArray, cons_equal: FuncArray, cons_unequal: FuncArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="newton", lamk: float=6., muk: float=10., sigma: float=8., alpha: float=0.5, beta: float=0.7, p: float=2., etak: float=1e-3, epsilon: float=1e-4, k: int=0) -> OutputType | 增广拉格朗日乘子法 |
|
|
218
242
|
|
|
219
243
|
### 方法的应用(example)
|
|
@@ -228,11 +252,11 @@ import optimtool.example as oe
|
|
|
228
252
|
oe.Lasso.[函数名]([矩阵A], [矩阵b], [因子mu], [参数表], [初始迭代点])
|
|
229
253
|
```
|
|
230
254
|
|
|
231
|
-
| 方法头
|
|
232
|
-
|
|
|
233
|
-
| gradient(A: NDArray, b: NDArray, mu: float, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, delta: float=10., alp: float=1e-3, epsilon: float=1e-2, k: int=0) -> OutputType | 光滑化Lasso函数法
|
|
255
|
+
| 方法头 | 解释 |
|
|
256
|
+
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------- |
|
|
257
|
+
| gradient(A: NDArray, b: NDArray, mu: float, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, delta: float=10., alp: float=1e-3, epsilon: float=1e-2, k: int=0) -> OutputType | 光滑化Lasso函数法 |
|
|
234
258
|
| subgradient(A: NDArray, b: NDArray, mu: float, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, alphak: float=2e-2, epsilon: float=1e-3, k: int=0) -> OutputType | 次梯度法Lasso避免一阶不可导 |
|
|
235
|
-
| approximate_point(A: NDArray, b: NDArray, mu: float, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, epsilon: float=1e-4, k: int=0) -> OutputType
|
|
259
|
+
| approximate_point(A: NDArray, b: NDArray, mu: float, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, epsilon: float=1e-4, k: int=0) -> OutputType | 邻近算子更新 |
|
|
236
260
|
|
|
237
261
|
#### 曲线相切问题(WanYuan)
|
|
238
262
|
|
|
@@ -246,8 +270,8 @@ oe.WanYuan.[函数名]([直线的斜率], [直线的截距], [二次项系数],
|
|
|
246
270
|
给定直线的斜率和截距,给定一个抛物线函数的二次项系数,一次项系数与常数项。 要求解一个给定圆心的圆,该圆同时与抛物线、直线相切,若存在可行方案,请给出切点的坐标。
|
|
247
271
|
```
|
|
248
272
|
|
|
249
|
-
| 方法头
|
|
250
|
-
|
|
|
273
|
+
| 方法头 | 解释 |
|
|
274
|
+
| ------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------- |
|
|
251
275
|
| solution(m: float, n: float, a: float, b: float, c: float, x3: float, y3: float, x_0: tuple, verbose: bool=False, draw: bool=False, eps: float=1e-10) -> str | 使用高斯-牛顿方法求解构造的7个残差函数 |
|
|
252
276
|
|
|
253
277
|
### 混合优化算法(hybrid)
|
|
@@ -262,8 +286,8 @@ import optimtool.hybrid as oh
|
|
|
262
286
|
oh.approt.[函数名]([目标函数], [参数表], [初始迭代点], [正则化参数], [邻近算子名])
|
|
263
287
|
```
|
|
264
288
|
|
|
265
|
-
| 方法头
|
|
266
|
-
|
|
|
289
|
+
| 方法头 | 解释 |
|
|
290
|
+
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------- |
|
|
267
291
|
| grad(funcs: FuncArray, args: ArgArray, x_0: PointArray, mu: float=1e-3, proxim: str="L1", tk: float=0.02, verbose: bool=False, draw: bool=True, output_f: bool=False, epsilon: float=1e-4, k: int=0) -> OutputType | 基于梯度方法的邻近近似 |
|
|
268
292
|
|
|
269
293
|
#### FISTA算法(fista)
|
|
@@ -272,10 +296,10 @@ oh.approt.[函数名]([目标函数], [参数表], [初始迭代点], [正则化
|
|
|
272
296
|
oh.fista.[函数名]([目标函数], [参数表], [初始迭代点], [正则化参数], [邻近算子名])
|
|
273
297
|
```
|
|
274
298
|
|
|
275
|
-
| 方法头
|
|
276
|
-
|
|
|
277
|
-
| normal(funcs: FuncArray, args: ArgArray, x_0: PointArray, mu: float=1e-3, proxim: str="L1", tk: float=0.02, verbose: bool=False, draw: bool=True, output_f: bool=False, epsilon: float=1e-4, k: int=0) -> OutputType
|
|
278
|
-
| variant(funcs: FuncArray, args: ArgArray, x_0: PointArray, mu: float=1e-3, proxim: str="L1", tk: float=0.02, verbose: bool=False, draw: bool=True, output_f: bool=False, epsilon: float=1e-4, k: int=0) -> OutputType | normal法的等价变形
|
|
299
|
+
| 方法头 | 解释 |
|
|
300
|
+
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------- |
|
|
301
|
+
| normal(funcs: FuncArray, args: ArgArray, x_0: PointArray, mu: float=1e-3, proxim: str="L1", tk: float=0.02, verbose: bool=False, draw: bool=True, output_f: bool=False, epsilon: float=1e-4, k: int=0) -> OutputType | 两步计算一个新点 |
|
|
302
|
+
| variant(funcs: FuncArray, args: ArgArray, x_0: PointArray, mu: float=1e-3, proxim: str="L1", tk: float=0.02, verbose: bool=False, draw: bool=True, output_f: bool=False, epsilon: float=1e-4, k: int=0) -> OutputType | normal法的等价变形 |
|
|
279
303
|
| decline(funcs: FuncArray, args: ArgArray, x_0: PointArray, mu: float=1e-3, proxim: str="L1", tk: float=0.02, verbose: bool=False, draw: bool=True, output_f: bool=False, epsilon: float=1e-4, k: int=0) -> OutputType | 基于函数下降趋势的变体 |
|
|
280
304
|
|
|
281
305
|
#### Nesterov算法(nesterov)
|
|
@@ -284,9 +308,9 @@ oh.fista.[函数名]([目标函数], [参数表], [初始迭代点], [正则化
|
|
|
284
308
|
oh.nesterov.[函数名]([目标函数], [参数表], [初始迭代点], [正则化参数], [邻近算子名])
|
|
285
309
|
```
|
|
286
310
|
|
|
287
|
-
| 方法头
|
|
288
|
-
|
|
|
289
|
-
| seckin(funcs: FuncArray, args: ArgArray, x_0: PointArray, mu: float=1e-3, proxim: str="L1", tk: float=0.02, verbose: bool=False, draw: bool=True, output_f: bool=False, epsilon: float=1e-4, k: int=0) -> OutputType
|
|
311
|
+
| 方法头 | 解释 |
|
|
312
|
+
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------- |
|
|
313
|
+
| seckin(funcs: FuncArray, args: ArgArray, x_0: PointArray, mu: float=1e-3, proxim: str="L1", tk: float=0.02, verbose: bool=False, draw: bool=True, output_f: bool=False, epsilon: float=1e-4, k: int=0) -> OutputType | 第二类Nesterov加速法 |
|
|
290
314
|
| accer(funcs: FuncArray, args: ArgArray, x_0: PointArray, mu: float=1e-3, proxim: str="L1", lk: float=0.01, tk: float=0.02, verbose: bool=False, draw: bool=True, output_f: bool=False, epsilon: float=1e-4, k: int=0) -> OutputType | 复合优化算法的加速框架 |
|
|
291
315
|
|
|
292
316
|
## LICENSE
|
|
@@ -41,6 +41,30 @@ pip install -e . --verbose
|
|
|
41
41
|
```text
|
|
42
42
|
pip install optimtool --upgrade
|
|
43
43
|
```
|
|
44
|
+
下载没有更改库架构的版本:
|
|
45
|
+
```text
|
|
46
|
+
pip install optimtool==2.3.5
|
|
47
|
+
```
|
|
48
|
+
下载优化库架构并增加typing变量的版本:
|
|
49
|
+
```text
|
|
50
|
+
pip install optimtool>=2.4.0
|
|
51
|
+
```
|
|
52
|
+
下载改进h2h函数的版本:
|
|
53
|
+
```text
|
|
54
|
+
pip install optimtool>=2.4.2
|
|
55
|
+
```
|
|
56
|
+
下载增强文档表达和检测非法输入的版本:
|
|
57
|
+
```text
|
|
58
|
+
pip install optimtool>=2.5.0rc0
|
|
59
|
+
```
|
|
60
|
+
下载支持hybrid算法的版本:
|
|
61
|
+
```text
|
|
62
|
+
pip install optimtool>=2.5.0
|
|
63
|
+
```
|
|
64
|
+
下载更好地支持numpy的版本:
|
|
65
|
+
```text
|
|
66
|
+
pip install optimtool>=2.6.0
|
|
67
|
+
```
|
|
44
68
|
## 项目结构
|
|
45
69
|
|
|
46
70
|
```textile
|
|
@@ -96,10 +120,10 @@ ou.[方法名].[函数名]([目标函数], [参数表], [初始迭代点])
|
|
|
96
120
|
ou.gradient_descent.[函数名]([目标函数], [参数表], [初始迭代点])
|
|
97
121
|
```
|
|
98
122
|
|
|
99
|
-
| 方法头
|
|
100
|
-
|
|
|
101
|
-
| solve(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, epsilon: float=1e-10, k: int=0) -> OutputType
|
|
102
|
-
| steepest(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="wolfe", epsilon: float=1e-10, k: int=0) -> OutputType
|
|
123
|
+
| 方法头 | 解释 |
|
|
124
|
+
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- |
|
|
125
|
+
| solve(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, epsilon: float=1e-10, k: int=0) -> OutputType | 通过解方程的方式来求解精确步长 |
|
|
126
|
+
| steepest(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="wolfe", epsilon: float=1e-10, k: int=0) -> OutputType | 使用线搜索方法求解非精确步长(默认使用wolfe线搜索) |
|
|
103
127
|
| barzilar_borwein(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="Grippo", c1: float=0.6, beta: float=0.6, M: int=20, eta: float=0.6, alpha: float=1., epsilon: float=1e-10, k: int=0) -> OutputType | 使用Grippo与ZhangHanger提出的非单调线搜索方法更新步长 |
|
|
104
128
|
|
|
105
129
|
#### 牛顿法(newton)
|
|
@@ -108,11 +132,11 @@ ou.gradient_descent.[函数名]([目标函数], [参数表], [初始迭代点])
|
|
|
108
132
|
ou.newton.[函数名]([目标函数], [参数表], [初始迭代点])
|
|
109
133
|
```
|
|
110
134
|
|
|
111
|
-
| 方法头
|
|
112
|
-
|
|
|
113
|
-
| classic(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, epsilon: float=1e-10, k: int=0) -> OutputType
|
|
114
|
-
| modified(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="wolfe", epsilon: float=1e-10, k: int=0) -> OutputType
|
|
115
|
-
| CG(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="wolfe", eps: float=1e-3, epsilon: float=1e-6, k: int=0) -> OutputType
|
|
135
|
+
| 方法头 | 解释 |
|
|
136
|
+
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ |
|
|
137
|
+
| classic(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, epsilon: float=1e-10, k: int=0) -> OutputType | 通过直接对目标函数二阶导矩阵(海瑟矩阵)进行求逆来获取下一步的步长 |
|
|
138
|
+
| modified(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="wolfe", epsilon: float=1e-10, k: int=0) -> OutputType | 修正当前海瑟矩阵保证其正定性(目前只接入了一种修正方法) |
|
|
139
|
+
| CG(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="wolfe", eps: float=1e-3, epsilon: float=1e-6, k: int=0) -> OutputType | 采用牛顿-共轭梯度法求解梯度(非精确牛顿法的一种) |
|
|
116
140
|
|
|
117
141
|
#### 拟牛顿法(newton_quasi)
|
|
118
142
|
|
|
@@ -120,10 +144,10 @@ ou.newton.[函数名]([目标函数], [参数表], [初始迭代点])
|
|
|
120
144
|
ou.newton_quasi.[函数名]([目标函数], [参数表], [初始迭代点])
|
|
121
145
|
```
|
|
122
146
|
|
|
123
|
-
| 方法头
|
|
124
|
-
|
|
|
125
|
-
| bfgs(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="wolfe", epsilon: float=1e-10, k: int=0) -> OutputType
|
|
126
|
-
| dfp(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="wolfe", epsilon: float=1e-10, k: int=0) -> OutputType
|
|
147
|
+
| 方法头 | 解释 |
|
|
148
|
+
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------- |
|
|
149
|
+
| bfgs(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="wolfe", epsilon: float=1e-10, k: int=0) -> OutputType | BFGS方法更新海瑟矩阵 |
|
|
150
|
+
| dfp(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="wolfe", epsilon: float=1e-10, k: int=0) -> OutputType | DFP方法更新海瑟矩阵 |
|
|
127
151
|
| L_BFGS(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="wolfe", m: int=6, epsilon: float=1e-10, k: int=0) -> OutputType | 双循环方法更新BFGS海瑟矩阵 |
|
|
128
152
|
|
|
129
153
|
#### 非线性最小二乘法(nonlinear_least_square)
|
|
@@ -131,10 +155,10 @@ ou.newton_quasi.[函数名]([目标函数], [参数表], [初始迭代点])
|
|
|
131
155
|
```python
|
|
132
156
|
ou.nonlinear_least_square.[函数名]([目标函数], [参数表], [初始迭代点])
|
|
133
157
|
```
|
|
134
|
-
| 方法头
|
|
135
|
-
|
|
|
136
|
-
| gauss_newton(funcr: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False,, draw: bool=True, output_f: bool=False, method: str="wolfe", epsilon: float=1e-10, k: int=0) -> OutputType
|
|
137
|
-
| levenberg_marquardt(funcr: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, lamk: float=1., eta: float=0.2, p1: float=0.4, p2: float=0.9, gamma1: float=0.7, gamma2: float=1.3, epsk: float=1e-6, epsilon: float=1e-10, k: int=0) -> OutputType | Levenberg Marquardt提出的方法框架
|
|
158
|
+
| 方法头 | 解释 |
|
|
159
|
+
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------- |
|
|
160
|
+
| gauss_newton(funcr: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False,, draw: bool=True, output_f: bool=False, method: str="wolfe", epsilon: float=1e-10, k: int=0) -> OutputType | 高斯-牛顿提出的方法框架,包括OR分解等操作 |
|
|
161
|
+
| levenberg_marquardt(funcr: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, lamk: float=1., eta: float=0.2, p1: float=0.4, p2: float=0.9, gamma1: float=0.7, gamma2: float=1.3, epsk: float=1e-6, epsilon: float=1e-10, k: int=0) -> OutputType | Levenberg Marquardt提出的方法框架 |
|
|
138
162
|
|
|
139
163
|
#### 信赖域方法(trust_region)
|
|
140
164
|
|
|
@@ -142,8 +166,8 @@ ou.nonlinear_least_square.[函数名]([目标函数], [参数表], [初始迭代
|
|
|
142
166
|
ou.trust_region.[函数名]([目标函数], [参数表], [初始迭代点])
|
|
143
167
|
```
|
|
144
168
|
|
|
145
|
-
| 方法头
|
|
146
|
-
|
|
|
169
|
+
| 方法头 | 解释 |
|
|
170
|
+
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------- |
|
|
147
171
|
| steihaug_CG(funcs: FuncArray, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, r0: float=1., rmax: float=2., eta: float=0.2, p1: float=0.4, p2: float=0.6, gamma1: float=0.5, gamma2: float=1.5, epsk: float=1e-6, epsilon: float=1e-6, k: int=0) -> OutputType | 截断共轭梯度法在此方法中被用于搜索步长 |
|
|
148
172
|
|
|
149
173
|
### 约束优化算法(constrain)
|
|
@@ -159,9 +183,9 @@ oc.[方法名].[函数名]([目标函数], [参数表], [等式约束表], [不
|
|
|
159
183
|
oc.equal.[函数名]([目标函数], [参数表], [等式约束表], [初始迭代点])
|
|
160
184
|
```
|
|
161
185
|
|
|
162
|
-
| 方法头
|
|
163
|
-
|
|
|
164
|
-
| penalty_quadratice(funcs: FuncArray, args: FuncArray, cons: FuncArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="newton", sigma: float=10., p: float=2., epsk: float=1e-4, epsilon: float=1e-
|
|
186
|
+
| 方法头 | 解释 |
|
|
187
|
+
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ |
|
|
188
|
+
| penalty_quadratice(funcs: FuncArray, args: FuncArray, cons: FuncArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="newton", sigma: float=10., p: float=2., epsk: float=1e-4, epsilon: float=1e-6, k: int=0) -> OutputType | 增加二次罚项 |
|
|
165
189
|
| lagrange_augmentede(funcs: FuncArray, args: ArgArray, cons: FuncArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="newton", lamk: float=6., sigma: float=10., p: float=2., etak: float=1e-4, epsilon: float=1e-6, k: int=0) -> OutputType | 增广拉格朗日乘子法 |
|
|
166
190
|
|
|
167
191
|
#### 不等式约束(unequal)
|
|
@@ -170,9 +194,9 @@ oc.equal.[函数名]([目标函数], [参数表], [等式约束表], [初始迭
|
|
|
170
194
|
oc.unequal.[函数名]([目标函数], [参数表], [不等式约束表], [初始迭代点])
|
|
171
195
|
```
|
|
172
196
|
|
|
173
|
-
| 方法头
|
|
174
|
-
|
|
|
175
|
-
| penalty_quadraticu(funcs: FuncArray, args: ArgArray, cons: FuncArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="newton", sigma: float=10., p: float=0.4, epsk: float=1e-4, epsilon: float=1e-
|
|
197
|
+
| 方法头 | 解释 |
|
|
198
|
+
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------ |
|
|
199
|
+
| penalty_quadraticu(funcs: FuncArray, args: ArgArray, cons: FuncArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="newton", sigma: float=10., p: float=0.4, epsk: float=1e-4, epsilon: float=1e-6, k: int=0) -> OutputType | 增加二次罚项 |
|
|
176
200
|
| lagrange_augmentedu(funcs: FuncArray, args: ArgArray, cons: FuncArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="newton", muk: float=10., sigma: float=8., alpha: float=0.2, beta: float=0.7, p: float=2., eta: float=1e-1, epsilon: float=1e-4, k: int=0) -> OutputType | 增广拉格朗日乘子法 |
|
|
177
201
|
|
|
178
202
|
#### 混合等式约束(mixequal)
|
|
@@ -181,10 +205,10 @@ oc.unequal.[函数名]([目标函数], [参数表], [不等式约束表], [初
|
|
|
181
205
|
oc.mixequal.[函数名]([目标函数], [参数表], [等式约束表], [不等式约束表], [初始迭代点])
|
|
182
206
|
```
|
|
183
207
|
|
|
184
|
-
| 方法头
|
|
185
|
-
|
|
|
186
|
-
| penalty_quadraticm(funcs: FuncArray, args: ArgArray, cons_equal: FuncArray, cons_unequal: FuncArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="newton", sigma: float=10., p: float=0.6, epsk: float=1e-6, epsilon: float=1e-10, k: int=0) -> OutputType
|
|
187
|
-
| penalty_L1(funcs: FuncArray, args: ArgArray, cons_equal: FuncArray, cons_unequal: FuncArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="newton", sigma: float=1., p: float=0.6, epsk: float=1e-6, epsilon: float=1e-10, k: int=0) -> OutputType
|
|
208
|
+
| 方法头 | 解释 |
|
|
209
|
+
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------ |
|
|
210
|
+
| penalty_quadraticm(funcs: FuncArray, args: ArgArray, cons_equal: FuncArray, cons_unequal: FuncArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="newton", sigma: float=10., p: float=0.6, epsk: float=1e-6, epsilon: float=1e-10, k: int=0) -> OutputType | 增加二次罚项 |
|
|
211
|
+
| penalty_L1(funcs: FuncArray, args: ArgArray, cons_equal: FuncArray, cons_unequal: FuncArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="newton", sigma: float=1., p: float=0.6, epsk: float=1e-6, epsilon: float=1e-10, k: int=0) -> OutputType | L1精确罚函数法 |
|
|
188
212
|
| lagrange_augmentedm(funcs: FuncArray, args: ArgArray, cons_equal: FuncArray, cons_unequal: FuncArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, method: str="newton", lamk: float=6., muk: float=10., sigma: float=8., alpha: float=0.5, beta: float=0.7, p: float=2., etak: float=1e-3, epsilon: float=1e-4, k: int=0) -> OutputType | 增广拉格朗日乘子法 |
|
|
189
213
|
|
|
190
214
|
### 方法的应用(example)
|
|
@@ -199,11 +223,11 @@ import optimtool.example as oe
|
|
|
199
223
|
oe.Lasso.[函数名]([矩阵A], [矩阵b], [因子mu], [参数表], [初始迭代点])
|
|
200
224
|
```
|
|
201
225
|
|
|
202
|
-
| 方法头
|
|
203
|
-
|
|
|
204
|
-
| gradient(A: NDArray, b: NDArray, mu: float, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, delta: float=10., alp: float=1e-3, epsilon: float=1e-2, k: int=0) -> OutputType | 光滑化Lasso函数法
|
|
226
|
+
| 方法头 | 解释 |
|
|
227
|
+
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------- |
|
|
228
|
+
| gradient(A: NDArray, b: NDArray, mu: float, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, delta: float=10., alp: float=1e-3, epsilon: float=1e-2, k: int=0) -> OutputType | 光滑化Lasso函数法 |
|
|
205
229
|
| subgradient(A: NDArray, b: NDArray, mu: float, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, alphak: float=2e-2, epsilon: float=1e-3, k: int=0) -> OutputType | 次梯度法Lasso避免一阶不可导 |
|
|
206
|
-
| approximate_point(A: NDArray, b: NDArray, mu: float, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, epsilon: float=1e-4, k: int=0) -> OutputType
|
|
230
|
+
| approximate_point(A: NDArray, b: NDArray, mu: float, args: ArgArray, x_0: PointArray, verbose: bool=False, draw: bool=True, output_f: bool=False, epsilon: float=1e-4, k: int=0) -> OutputType | 邻近算子更新 |
|
|
207
231
|
|
|
208
232
|
#### 曲线相切问题(WanYuan)
|
|
209
233
|
|
|
@@ -217,8 +241,8 @@ oe.WanYuan.[函数名]([直线的斜率], [直线的截距], [二次项系数],
|
|
|
217
241
|
给定直线的斜率和截距,给定一个抛物线函数的二次项系数,一次项系数与常数项。 要求解一个给定圆心的圆,该圆同时与抛物线、直线相切,若存在可行方案,请给出切点的坐标。
|
|
218
242
|
```
|
|
219
243
|
|
|
220
|
-
| 方法头
|
|
221
|
-
|
|
|
244
|
+
| 方法头 | 解释 |
|
|
245
|
+
| ------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------- |
|
|
222
246
|
| solution(m: float, n: float, a: float, b: float, c: float, x3: float, y3: float, x_0: tuple, verbose: bool=False, draw: bool=False, eps: float=1e-10) -> str | 使用高斯-牛顿方法求解构造的7个残差函数 |
|
|
223
247
|
|
|
224
248
|
### 混合优化算法(hybrid)
|
|
@@ -233,8 +257,8 @@ import optimtool.hybrid as oh
|
|
|
233
257
|
oh.approt.[函数名]([目标函数], [参数表], [初始迭代点], [正则化参数], [邻近算子名])
|
|
234
258
|
```
|
|
235
259
|
|
|
236
|
-
| 方法头
|
|
237
|
-
|
|
|
260
|
+
| 方法头 | 解释 |
|
|
261
|
+
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------- |
|
|
238
262
|
| grad(funcs: FuncArray, args: ArgArray, x_0: PointArray, mu: float=1e-3, proxim: str="L1", tk: float=0.02, verbose: bool=False, draw: bool=True, output_f: bool=False, epsilon: float=1e-4, k: int=0) -> OutputType | 基于梯度方法的邻近近似 |
|
|
239
263
|
|
|
240
264
|
#### FISTA算法(fista)
|
|
@@ -243,10 +267,10 @@ oh.approt.[函数名]([目标函数], [参数表], [初始迭代点], [正则化
|
|
|
243
267
|
oh.fista.[函数名]([目标函数], [参数表], [初始迭代点], [正则化参数], [邻近算子名])
|
|
244
268
|
```
|
|
245
269
|
|
|
246
|
-
| 方法头
|
|
247
|
-
|
|
|
248
|
-
| normal(funcs: FuncArray, args: ArgArray, x_0: PointArray, mu: float=1e-3, proxim: str="L1", tk: float=0.02, verbose: bool=False, draw: bool=True, output_f: bool=False, epsilon: float=1e-4, k: int=0) -> OutputType
|
|
249
|
-
| variant(funcs: FuncArray, args: ArgArray, x_0: PointArray, mu: float=1e-3, proxim: str="L1", tk: float=0.02, verbose: bool=False, draw: bool=True, output_f: bool=False, epsilon: float=1e-4, k: int=0) -> OutputType | normal法的等价变形
|
|
270
|
+
| 方法头 | 解释 |
|
|
271
|
+
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------- |
|
|
272
|
+
| normal(funcs: FuncArray, args: ArgArray, x_0: PointArray, mu: float=1e-3, proxim: str="L1", tk: float=0.02, verbose: bool=False, draw: bool=True, output_f: bool=False, epsilon: float=1e-4, k: int=0) -> OutputType | 两步计算一个新点 |
|
|
273
|
+
| variant(funcs: FuncArray, args: ArgArray, x_0: PointArray, mu: float=1e-3, proxim: str="L1", tk: float=0.02, verbose: bool=False, draw: bool=True, output_f: bool=False, epsilon: float=1e-4, k: int=0) -> OutputType | normal法的等价变形 |
|
|
250
274
|
| decline(funcs: FuncArray, args: ArgArray, x_0: PointArray, mu: float=1e-3, proxim: str="L1", tk: float=0.02, verbose: bool=False, draw: bool=True, output_f: bool=False, epsilon: float=1e-4, k: int=0) -> OutputType | 基于函数下降趋势的变体 |
|
|
251
275
|
|
|
252
276
|
#### Nesterov算法(nesterov)
|
|
@@ -255,9 +279,9 @@ oh.fista.[函数名]([目标函数], [参数表], [初始迭代点], [正则化
|
|
|
255
279
|
oh.nesterov.[函数名]([目标函数], [参数表], [初始迭代点], [正则化参数], [邻近算子名])
|
|
256
280
|
```
|
|
257
281
|
|
|
258
|
-
| 方法头
|
|
259
|
-
|
|
|
260
|
-
| seckin(funcs: FuncArray, args: ArgArray, x_0: PointArray, mu: float=1e-3, proxim: str="L1", tk: float=0.02, verbose: bool=False, draw: bool=True, output_f: bool=False, epsilon: float=1e-4, k: int=0) -> OutputType
|
|
282
|
+
| 方法头 | 解释 |
|
|
283
|
+
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------- |
|
|
284
|
+
| seckin(funcs: FuncArray, args: ArgArray, x_0: PointArray, mu: float=1e-3, proxim: str="L1", tk: float=0.02, verbose: bool=False, draw: bool=True, output_f: bool=False, epsilon: float=1e-4, k: int=0) -> OutputType | 第二类Nesterov加速法 |
|
|
261
285
|
| accer(funcs: FuncArray, args: ArgArray, x_0: PointArray, mu: float=1e-3, proxim: str="L1", lk: float=0.01, tk: float=0.02, verbose: bool=False, draw: bool=True, output_f: bool=False, epsilon: float=1e-4, k: int=0) -> OutputType | 复合优化算法的加速框架 |
|
|
262
286
|
|
|
263
287
|
## LICENSE
|
|
@@ -32,4 +32,4 @@ from .base import MATPLOTLIB_VERSION
|
|
|
32
32
|
from ._version import __version__
|
|
33
33
|
|
|
34
34
|
if sys.version_info < (3, 7, 0):
|
|
35
|
-
raise OSError(f'optimtool-2.
|
|
35
|
+
raise OSError(f'optimtool-2.7.1 requires Python >=3.7, but yours is {sys.version}')
|
|
@@ -168,7 +168,7 @@ def barzilar_borwein(funcs: FuncArray,
|
|
|
168
168
|
x_0 = x_0 + delta
|
|
169
169
|
yk = np.array(res.subs(dict(zip(args, x_0)))).astype(DataType) + dk
|
|
170
170
|
alpha_up = delta.dot(delta.T)
|
|
171
|
-
alpha_down = delta.dot(yk.T)
|
|
171
|
+
alpha_down = (delta.dot(yk.T))[0]
|
|
172
172
|
if alpha_down != 0:
|
|
173
173
|
alpha = alpha_up / alpha_down
|
|
174
174
|
k += 1
|
|
@@ -65,12 +65,11 @@ def bfgs(funcs: FuncArray,
|
|
|
65
65
|
dk = -np.linalg.inv(hessian).dot(gradient.T).reshape(1, -1)
|
|
66
66
|
if np.linalg.norm(dk) >= epsilon:
|
|
67
67
|
alpha = search(funcs, args, x_0, dk)
|
|
68
|
-
delta = alpha * dk
|
|
69
|
-
x_0 += delta
|
|
70
|
-
sk = alpha * dk
|
|
68
|
+
delta = alpha * dk # sk
|
|
69
|
+
x_0 += delta[0]
|
|
71
70
|
yk = np.array(res.subs(dict(zip(args, x_0)))).astype(DataType) - np.array(res.subs(reps)).astype(DataType)
|
|
72
71
|
if yk.all != 0:
|
|
73
|
-
hessian += (yk.T).dot(yk) /
|
|
72
|
+
hessian += (yk.T).dot(yk) / delta.dot(yk.T) - (hessian.dot(delta.T)).dot((hessian.dot(delta.T)).T) / delta.dot((hessian.dot(delta.T)))
|
|
74
73
|
k += 1
|
|
75
74
|
else:
|
|
76
75
|
break
|
|
@@ -117,12 +116,11 @@ def dfp(funcs: FuncArray,
|
|
|
117
116
|
dk = -hessiani.dot(gradient.T).reshape(1, -1)
|
|
118
117
|
if np.linalg.norm(dk) >= epsilon:
|
|
119
118
|
alpha = search(funcs, args, x_0, dk)
|
|
120
|
-
delta = alpha * dk
|
|
121
|
-
x_0 += delta
|
|
122
|
-
sk = alpha * dk
|
|
119
|
+
delta = alpha * dk # sk
|
|
120
|
+
x_0 += delta[0]
|
|
123
121
|
yk = np.array(res.subs(dict(zip(args, x_0)))).astype(DataType) - np.array(res.subs(reps)).astype(DataType)
|
|
124
122
|
if yk.all != 0:
|
|
125
|
-
hessiani = hessiani - (hessiani.dot(yk.T)).dot((hessiani.dot(yk.T)).T) / yk.dot(hessiani.dot(yk.T)) + (
|
|
123
|
+
hessiani = hessiani - (hessiani.dot(yk.T)).dot((hessiani.dot(yk.T)).T) / yk.dot(hessiani.dot(yk.T)) + (delta.T).dot(delta) / yk.dot(delta.T)
|
|
126
124
|
k += 1
|
|
127
125
|
else:
|
|
128
126
|
break
|
|
@@ -175,17 +173,17 @@ def L_BFGS(funcs: FuncArray,
|
|
|
175
173
|
dk = -double_loop(grad, p, s, y, m, k, Hkm).reshape(1, -1)
|
|
176
174
|
if np.linalg.norm(dk) >= epsilon:
|
|
177
175
|
alphak = search(funcs, args, x_0, dk)
|
|
178
|
-
|
|
176
|
+
delta = alphak * dk # sk
|
|
177
|
+
x_0 += delta[0]
|
|
179
178
|
if k > m:
|
|
180
179
|
s[k-m] = np.empty((1, l))
|
|
181
180
|
y[k-m] = np.empty((1, l))
|
|
182
|
-
|
|
183
|
-
s.append(sk)
|
|
181
|
+
s.append(delta)
|
|
184
182
|
yk = np.array(res.subs(dict(zip(args, x_0)))).astype(DataType) - grad
|
|
185
183
|
y.append(yk)
|
|
186
|
-
pk = 1 / yk.dot(
|
|
184
|
+
pk = 1 / yk.dot(delta.T)
|
|
187
185
|
p.append(pk)
|
|
188
|
-
gammak =
|
|
186
|
+
gammak = delta.dot(delta.T) / yk.dot(yk.T)
|
|
189
187
|
gamma.append(gammak)
|
|
190
188
|
k = k + 1
|
|
191
189
|
else:
|