是否有算法检查给定(可能是非线性)函数f是否始终为正?
我目前的想法是找到函数的根源(使用newton-raphson算法或类似的技术,参见http://en.wikipedia.org/wiki/Root-finding_algorithm)并检查衍生物或找到最小值f,但它们似乎不是这个问题的最佳解决方案,根查找算法也有很多收敛问题.
例如,在Maple中,函数验证可以做到这一点,但我需要在我自己的程序中实现它.Maple帮助验证:http://www.maplesoft.com/support/help/Maple/view.aspx? path = verify/function_shells Maple示例:assume(x,'real'); 验证(x ^ 2 + 1,0,'greater_than'); - >返回true,因为对于每个x我们都有x ^ 2 + 1> 0
[编辑]问题的一些背景:函数$ f $是电路的右手微分非线性模型.非线性电路可以通过应用修改的节点分析(MNA)建模为一组常微分方程,为简单起见,我们只考虑具有1维的系统,因此$ x'= f(x)$其中$ f $描述电路,例如$ f $可以是$ f(x)= 10x - 100x ^ 2 + 200x ^ 3 - 300x ^ 4 + 100x ^ 5 $(非线性隧道二极管的模型)或$ f = 10 - 2sin (4x)+ 3x $(约瑟夫森交界处的模型).
$ x $是有界的,$ f $仅在R $的区间$ [a,b] \中定义.$ f $是连续的.我也可以假设$ f $是Lipschitz,Lipschitz常数L> 0,但我不想,除非我必须.
考虑R中的非线性最小二乘模型,例如以下形式:
y ~ theta / ( 1 + exp( -( alpha + beta * x) ) )
Run Code Online (Sandbox Code Playgroud)
(我的真正的问题有几个变量,外部函数不是逻辑但更多涉及;这个更简单,但我想如果我能做到这一点,我的情况应该几乎立即跟随)
我想用(例如)自然三次样条替换术语"alpha + beta*x".
这里有一些代码用于在逻辑内部创建一些非线性函数的示例数据:
set.seed(438572L)
x <- seq(1,10,by=.25)
y <- 8.6/(1+exp( -(-3+x/4.4+sqrt(x*1.1)*(1.-sin(1.+x/2.9))) )) + rnorm(x, s=0.2 )
Run Code Online (Sandbox Code Playgroud)
如果我在lm中不需要逻辑,我可以轻松地用样条项替换线性项; 所以线性模型是这样的:
lm( y ~ x )
Run Code Online (Sandbox Code Playgroud)
然后成为
library("splines")
lm( y ~ ns( x, df = 5 ) )
Run Code Online (Sandbox Code Playgroud)
生成拟合值很简单,并借助于(例如)rms包得到预测值似乎很简单.
实际上,将原始数据与基于lm的样条拟合拟合并不是太糟糕,但我有理由在逻辑函数中需要它(或者更确切地说,在我的问题中等效).
nls的问题是我需要为所有参数提供名称(我很高兴他们称之为(b1,...,b5)为一个样条拟合(并说c1,...,c6为另一个变量) - 我需要能够制作其中的几个).
是否有一种合理的方法来生成nls的相应公式,以便我可以用样条函数替换非线性函数内的线性项?
我能想到的唯一方法就是可以做到这一点有点尴尬和笨重,如果不编写一大堆代码就不能很好地概括.
(编辑以供澄清)对于这个小问题,我当然可以手工完成 - 写出由ns生成的矩阵中每个变量的内积的表达式,乘以参数的向量.但是,我必须为每个其他变量中的每个样条再次逐个编写整个项目,并且每次我更改任何样条曲线中的df时再次,并且如果我想使用cs而不是ns,则再次.然后,当我想尝试做一些预测(/插值)时,我们会得到一系列新的问题需要处理.我需要一遍又一遍地继续这样做,并且可能需要大量的结和几个变量,以便在分析后进行分析 - 我想知道是否有一种比写出每个单独术语更简洁,更简单的方法,无需编写大量代码.我可以看到一个相当牛逼的方式,这将涉及到相当多的代码,但是作为R,我怀疑有更简洁的方式(或更可能是3或4个更简洁的方式)只是躲避我.因此问题.
我以为我曾经看到有人在过去以相当不错的方式做过这样的事情,但对于我的生活,我现在找不到它; 我已经尝试了很多次来找到它.
[更具体地说,我通常希望能够尝试适合每个变量中的几个不同样条曲线 - 尝试几种可能性 - 以便看看我是否能找到一个简单的模型,但仍然适合这个目的是足够的(噪音真的非常低;合适的偏差可以达到很好的平滑效果,但只能达到一定程度).它更像是"找到一个漂亮的,可解释的,但足够的拟合函数",而不是任何接近推理和数据挖掘的东西都不是这个问题的真正问题.
或者,如果这比gnm或ASSIST或其他包装更容易,那将是有用的知识,但是关于如何继续上述玩具问题的一些指示将有所帮助.
因此,我在R中遇到了这个奇怪的错误。我有一个简单的函数,当比较实际价格和模拟价格时会返回错误项hestondifferences()。
当我尝试通过以下方式找到本地最小值时:
res<-optim(fn=hestondifferences, par = c(vT=vT, rho=rho, k=k, sigma=sigma))
Run Code Online (Sandbox Code Playgroud)
我收到错误消息:
optim中的误差(fn = hestondifferences,par = c(vT = vT,rho = rho,k = k,:无法在初始参数处评估函数
令我感到困惑的是,直接使用初始参数调用该函数会hestondifferences(vT, rho, k, sigma)返回正确的值。
该函数hestondifferences()以某种方式编写:只要无法对某些参数集进行仿真,它将返回NA与optim()期望相符的结果。
我有以下数据:
dput(dat)
structure(list(Band = c(1930, 1930, 1930, 1930, 1930, 1930, 1930,
1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930
), Reflectance = c(25.296494, 21.954657, 18.981184, 15.984661,
14.381341, 12.485372, 10.592539, 8.51772, 7.601568, 7.075429,
6.205453, 5.36646, 4.853167, 4.21576, 3.979639, 3.504217, 3.313851,
2.288752), Number.of.Sprays = c(0, 1, 2, 3, 5, 6, 7, 9, 10, 11,
14, 17, 19, 21, 27, 30, 36, 49), Legend = structure(c(4L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, …Run Code Online (Sandbox Code Playgroud) 在非线性算术和未解释的函数中,莱昂纳多德莫拉表示这种qfnra-nlsat策略尚未与Z3的其余部分完全整合.我认为情况在两年内发生了变化,但显然整合还不是很完整.
在下面的示例中,我将数据类型纯粹用于"软件工程"目的:将数据组织到记录中.即使没有未解释的功能,Z3仍然无法给我一个解决方案:
(declare-datatypes () (
(Point (point (point-x Real) (point-y Real)))
(Line (line (line-a Real) (line-b Real) (line-c Real)))))
(define-fun point-line-subst ((p Point) (l Line)) Real
(+ (* (line-a l) (point-x p)) (* (line-b l) (point-y p)) (line-c l)))
(declare-const p Point)
(declare-const l Line)
(assert (> (point-y p) 20.0))
(assert (= 0.0 (point-line-subst p l)))
(check-sat-using qfnra-nlsat)
(get-model)
Run Code Online (Sandbox Code Playgroud)
> unknown
(model
)
Run Code Online (Sandbox Code Playgroud)
但是,如果我手动内联所有函数,Z3会立即找到一个模型:
(declare-const x Real)
(declare-const y Real)
(declare-const a Real)
(declare-const b Real) …Run Code Online (Sandbox Code Playgroud) 我正在寻找支持非线性内核和一对多方案的SVM实现,以执行多标签分类.最好用Python编写,或者我可以用Python用包装器调用.
我正在研究sklearn,有两种实现使用SVM进行分类:
sklearn.svm.LinearSVC - 支持使用one-rest-rest方案进行多标签分类,但它基于liblinear,因此仅支持线性内核.
sklearn.svm.SVC - 基于libsvm,支持非线性内核,但多标签分类是在一对一减少的情况下完成的,它为K-way训练K(K-1)/ 2二元分类器多类问题.
更多信息,请访问:http: //scikit-learn.org/stable/modules/multiclass.html
有谁知道任何其他直接支持多标签分类和非线性内核的SVM实现?
一种可能的解决方案也可能是根据sklearn.svm.SVC调整代码,以执行One-vs-Rest,这是否已经尝试过?
machine-learning svm nonlinear-functions scikit-learn multilabel-classification
我对朱莉娅很陌生。我正在尝试求解非线性方程组以找到向量 ( p_new)。下面是我的问题的简化版本。问题是我收到此消息:"ERROR: MethodError: no method matching zero(::, Type{Any})"。我不确定是否是因为初始条件没有明确定义。提前致谢!
p_1 = [ 1, 2, 2.3]
p_1b = [ 1, 2.2, 2.5]
mgc = [1, 1, 0.5]
theta = 0.8
OW1 = [0 1 0; 1 1 1; 0 0 1]
g = ones(3,1)
function pupdate!(p_1,mgc,theta,OW1)
delt = p_1.*theta
delt = 2.718281828459.^delt
Sp1 = sum(delt)
sp1 = delt./Sp1
markup = p_1 .- mgc
sp1 .= markup
end
g0 = [p_1b, mgc, theta, OW1]
p_new = nlsolve(pupdate!, g0)
Run Code Online (Sandbox Code Playgroud) 在使用 Julia 中的 SymPy 进行一个过程之后,我生成了一个非线性方程组。为简单起见,我将在此处对非线性方程进行近似处理。我得到的是这样的等式:
R = (p) -> -5.0488*p + p^2.81 - 3.38/( p^(-1.0) )^2.0
Run Code Online (Sandbox Code Playgroud)
我可以绘制 R 函数
using Plots
plot(R, 0,8)
Run Code Online (Sandbox Code Playgroud)
我们可以看到 R 函数有两个零:p = 0 和 5.850< p < 8.75。我想找到正零。为此,我尝试了 nlsolve 函数,但出现错误:
using NLsolve
nlsolve(R , 5.8)
MethodError: no method matching nlsolve(::var"#1337#1338", ::Float64)
Closest candidates are:
nlsolve(::Any, ::Any, !Matched::AbstractArray; inplace, kwargs...)
Run Code Online (Sandbox Code Playgroud)
首先,我的 nlsolve 函数哪里出了问题?
如果可能,我会很感激在 Julia 中使用 SymPy 包的解决方案。
我正在尝试在 Mathemtica 中求解非线性方程组。我尝试了 Solve 和 NSolve,我还尝试定义 a_{ij} 和 b_{ij} 和 m33=1 数值来简化方程,但是 Mathematica 似乎工作时间太长或者我做错了什么。在 Mathematica 中我只是想找到解决方案,但我还需要一些 c/c++ lib 来在我的代码中执行此操作。
“运算符”中的主要方程:
M[A[(x,y)]]=B[M[(x,y)]]
Run Code Online (Sandbox Code Playgroud)
其中“operator”是透视变换:
u= (m13 + m11*x + m12*y)/(m33 + m31*x + m32*y);
v= (m23 + m21*x +m22*y)/(m33 + m31*x + m32*y);
Run Code Online (Sandbox Code Playgroud)
我在 Mathematica 中的输入:
Solve[(b13 + (b11 (m13 + m11 x1 + m12 y1))/(m33 + m31 x1 +
m32 y1) + (b12 (m23 + m21 x1 + m22 y1))/(m33 + m31 x1 +
m32 y1))/(b33 + (b31 (m13 + m11 …Run Code Online (Sandbox Code Playgroud) math numerical wolfram-mathematica nonlinear-functions numerical-methods
我想要拟合一个线性平台 (nls) 模型,将身高描述为年龄的函数,并且我想测试区域之间模型的任何参数是否存在显着差异。
\n这是我到目前为止所拥有的:
\n# Create data\ndf1 <- cbind.data.frame (height = c (0.5, 0.6, 0.9, 1.3, 1.5, 1.6, 1.6,\n 0.6, 0.6, 0.8, 1.3, 1.5, 1.6, 1.5,\n 0.6, 0.8, 1.0, 1.4, 1.6, 1.6, 1.6,\n 0.5, 0.8, 1.0, 1.3, 1.6, 1.7, 1.6),\n age = c (0.5, 0.9, 3.0, 7.3, 12.2, 15.5, 20.0,\n 0.4, 0.8, 2.3, 8.5, 11.5, 14.8, 21.3,\n 0.5, 1.0, 5.1, 11.1, 12.3, 16.0, 19.8,\n 0.5, 1.1, 5.5, 10.2, 12.2, 15.4, 20.5),\n region = as.factor (c (rep ("A", 7),\n …Run Code Online (Sandbox Code Playgroud)