扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
Python math 库提供许多对浮点数的数学运算函数,math模块不支持复数运算,若需计算复数,可使用cmath模块(本文不赘述)。
目前创新互联建站已为千余家的企业提供了网站建设、域名、雅安服务器托管、成都网站托管、企业网站设计、建邺网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
使用dir函数,查看math库中包含的所有内容:
1) math.pi # 圆周率π
2) math.e #自然对数底数
3) math.inf #正无穷大∞,-math.inf #负无穷大-∞
4) math.nan #非浮点数标记,NaN(not a number)
1) math.fabs(x) #表示X值的绝对值
2) math.fmod(x,y) #表示x/y的余数,结果为浮点数
3) math.fsum([x,y,z]) #对括号内每个元素求和,其值为浮点数
4) math.ceil(x) #向上取整,返回不小于x的最小整数
5)math.floor(x) #向下取整,返回不大于x的最大整数
6) math.factorial(x) #表示X的阶乘,其中X值必须为整型,否则报错
7) math.gcd(a,b) #表示a,b的最大公约数
8) math.frexp(x) #x = i *2^j,返回(i,j)
9) math.ldexp(x,i) #返回x*2^i的运算值,为math.frexp(x)函数的反运算
10) math.modf(x) #表示x的小数和整数部分
11) math.trunc(x) #表示x值的整数部分
12) math.copysign(x,y) #表示用数值y的正负号,替换x值的正负号
13) math.isclose(a,b,rel_tol =x,abs_tol = y) #表示a,b的相似性,真值返回True,否则False;rel_tol是相对公差:表示a,b之间允许的最大差值,abs_tol是最小绝对公差,对比较接近于0有用,abs_tol必须至少为0。
14) math.isfinite(x) #表示当x不为无穷大时,返回True,否则返回False
15) math.isinf(x) #当x为±∞时,返回True,否则返回False
16) math.isnan(x) #当x是NaN,返回True,否则返回False
1) math.pow(x,y) #表示x的y次幂
2) math.exp(x) #表示e的x次幂
3) math.expm1(x) #表示e的x次幂减1
4) math.sqrt(x) #表示x的平方根
5) math.log(x,base) #表示x的对数值,仅输入x值时,表示ln(x)函数
6) math.log1p(x) #表示1+x的自然对数值
7) math.log2(x) #表示以2为底的x对数值
8) math.log10(x) #表示以10为底的x的对数值
1) math.degrees(x) #表示弧度值转角度值
2) math.radians(x) #表示角度值转弧度值
3) math.hypot(x,y) #表示(x,y)坐标到原点(0,0)的距离
4) math.sin(x) #表示x的正弦函数值
5) math.cos(x) #表示x的余弦函数值
6) math.tan(x) #表示x的正切函数值
7)math.asin(x) #表示x的反正弦函数值
8) math.acos(x) #表示x的反余弦函数值
9) math.atan(x) #表示x的反正切函数值
10) math.atan2(y,x) #表示y/x的反正切函数值
11) math.sinh(x) #表示x的双曲正弦函数值
12) math.cosh(x) #表示x的双曲余弦函数值
13) math.tanh(x) #表示x的双曲正切函数值
14) math.asinh(x) #表示x的反双曲正弦函数值
15) math.acosh(x) #表示x的反双曲余弦函数值
16) math.atanh(x) #表示x的反双曲正切函数值
1)math.erf(x) #高斯误差函数
2) math.erfc(x) #余补高斯误差函数
3) math.gamma(x) #伽马函数(欧拉第二积分函数)
4) math.lgamma(x) #伽马函数的自然对数
线性模型(二)之多项式拟合
1. 多项式拟合问题
多项式拟合(polynominal curve fitting)是一种线性模型,模型和拟合参数的关系是线性的。多项式拟合的输入是一维的,即x=xx=x,这是多项式拟合和线性回归问题的主要区别之一。
多项式拟合的目标是构造输入xx的MM阶多项式函数,使得该多项式能够近似表示输入xx和输出yy的关系,虽然实际上xx和yy的关系并不一定是多项式,但使用足够多的阶数,总是可以逼近表示输入xx和输出yy的关系的。
多项式拟合问题的输入可以表示如下:
D={(x1,y1),(x2,y2),...,(xi,yi),...,(xN,yN)}xi∈Ryi∈R
D={(x1,y1),(x2,y2),...,(xi,yi),...,(xN,yN)}xi∈Ryi∈R
目标输出是得到一个多项式函数:
f(x)=w1x1+w2x2+wixi+...+wMxM+b=(∑i=1Mwixi)+b
f(x)=w1x1+w2x2+wixi+...+wMxM+b=(∑i=1Mwixi)+b
其中MM表示最高阶数为MM。
可见在线性拟合的模型中,共包括了(M+1)(M+1)个参数,而该模型虽然不是输入xx的线性函数,但却是(M+1)(M+1)个拟合参数的线性函数,所以称多项式拟合为线性模型。对于多项式拟合问题,其实就是要确定这(M+1)(M+1)个参数,这里先假设阶数MM是固定的(MM是一个超参数,可以用验证集来确定MM最优的值,详细的关于MM值确定的问题,后面再讨论),重点就在于如何求出这(M+1)(M+1)个参数的值。
2.优化目标
多项式拟合是利用多项式函数逼近输入xx和输出yy的函数关系,通过什么指标来衡量某个多项式函数的逼近程度呢?(其实这就是误差/损失函数)。拟合/回归问题常用的评价指标是均方误差(在机器学习中的模型评估与度量博客中,我进行了介绍)。多项式拟合问题也同样采用该评价指标,以均方误差作为误差/损失函数,误差函数越小,模型越好。
E(w,b)=1N∑i=1N[f(xi)−yi]2
E(w,b)=1N∑i=1N[f(xi)−yi]2
系数1N1N是一常数,对优化结果无影响,可以去除,即将均方误差替换为平方误差:
E(w,b)=∑i=1N[f(xi)−yi]2
E(w,b)=∑i=1N[f(xi)−yi]2
到这里,就成功把多项式拟合问题变成了最优化问题,优化问题可表示为:
argminw,bE(w,b)
argminw,bE(w,b)
即需要求得参数{w1,...,wM,b}{w1,...,wM,b}的值,使得E(w,b)E(w,b)最小化。那么如何对该最优化问题求解呢?
3. 优化问题求解
3.1 求偏导,联立方程求解
直观的想法是,直接对所有参数求偏导,令偏导为0,再联立这M+1M+1个方程求解(因为共有M+1M+1个参数,故求偏导后也是得到M+1M+1个方程)。
E(w,b)=∑i=1N[f(xi)−yi]2=∑i=1N[(w1x1i+w2x2i+wixji+...+wMxMi+b)−yi]2
E(w,b)=∑i=1N[f(xi)−yi]2=∑i=1N[(w1xi1+w2xi2+wixij+...+wMxiM+b)−yi]2
利用E(w,b)E(w,b)对各个参数求偏导,如下:
∂E(w,b)∂wj∂E(w,b)∂b=2∑i=1N[(w1x1i+w2x2i+wixji+...+wMxMi+b)−yi]xji=2∑i=1N[(w1x1i+w2x2i+wixji+...+wMxMi+b)−yi]
∂E(w,b)∂wj=2∑i=1N[(w1xi1+w2xi2+wixij+...+wMxiM+b)−yi]xij∂E(w,b)∂b=2∑i=1N[(w1xi1+w2xi2+wixij+...+wMxiM+b)−yi]
求导之后,将各个点(xi,yi)(xi,yi)的值带入偏导公式,联立方程求解即可。
针对该解法,可以举个例子详细说明,比如有两个点(2,3),(5,8)(2,3),(5,8),需要利用二阶多项式f(x)=w1x+w2x2+bf(x)=w1x+w2x2+b拟合。求解过程如下:
该二阶多项式对参数求偏导得到
∂E(w,b)∂wj∂E(w,b)∂b=2∑i=12[(w1x1i+w2x2i+b)−yi]xji=[(w1x1+w2x21+b)−y1]xj1+[(w1x2+w2x22+b)−y2]xj2=2∑i=12[(w1x1i+w2x2i+b)−yi]=[(w1x1+w2x21+b)−y1]+[(w1x2+w2x22+b)−y2]
∂E(w,b)∂wj=2∑i=12[(w1xi1+w2xi2+b)−yi]xij=[(w1x1+w2x12+b)−y1]x1j+[(w1x2+w2x22+b)−y2]x2j∂E(w,b)∂b=2∑i=12[(w1xi1+w2xi2+b)−yi]=[(w1x1+w2x12+b)−y1]+[(w1x2+w2x22+b)−y2]
将点(2,3),(5,8)(2,3),(5,8)带入方程,可以得到3个方程,
2b+7w1+29w2=117b+29w1+133w2=4629b+133w1+641w2=212
2b+7w1+29w2=117b+29w1+133w2=4629b+133w1+641w2=212
联立这三个方程求解,发现有无穷多的解,只能得到3w1+21w2=53w1+21w2=5,这三个方程是线性相关的,故没有唯一解。
该方法通过求偏导,再联立方程求解,比较复杂,看着也很不美观。那么有没有更加方便的方法呢?
3.2 最小二乘法
其实求解该最优化问题(平方和的最小值)一般会采用最小二乘法(其实最小二乘法和求偏导再联立方程求解的方法无本质区别,求偏导也是最小二乘法,只是这里介绍最小二乘的矩阵形式而已)。最小二乘法(least squares),从英文名非常容易想到,该方法就是求解平方和的最小值的方法。
可以将误差函数以矩阵的表示(NN个点,最高MM阶)为:
∥Xw−y∥2
‖Xw−y‖2
其中,把偏置bb融合到了参数ww中,
w={b,w1,w2,...,wM}
w={b,w1,w2,...,wM}
XX则表示输入矩阵,
⎡⎣⎢⎢⎢⎢11...1x1x2...xNx21x22...x2N............xM1xM2...xMN⎤⎦⎥⎥⎥⎥
[1x1x12...x1M1x2x22...x2M...............1xNxN2...xNM]
yy则表示标注向量,
y={y1,y2,...,yN}T
y={y1,y2,...,yN}T
因此,最优化问题可以重新表示为
minw∥Xw−y∥2
minw‖Xw−y‖2
对其求导,
∂∥Xw−y∥2∂w=∂(Xw−y)T(Xw−y)∂w=∂(wTXT−yT)(Xw−y)∂w=∂(wTXTXw−yTXw−wTXTy+yTy)∂w
∂‖Xw−y‖2∂w=∂(Xw−y)T(Xw−y)∂w=∂(wTXT−yT)(Xw−y)∂w=∂(wTXTXw−yTXw−wTXTy+yTy)∂w
在继续对其求导之前,需要先补充一些矩阵求导的先验知识(常见的一些矩阵求导公式可以参见转载的博客),如下:
∂xTa∂x=a∂ax∂x=aT∂xTA∂x=Ax+ATx
∂xTa∂x=a∂ax∂x=aT∂xTA∂x=Ax+ATx
根据上面的矩阵求导规则,继续进行损失函数的求导
∂∥Xw−y∥2∂w=∂(wTXTXw−yTXw−wTXTy+yTy)∂w=XTXw+(XTX)Tw−(yTX)T−XTy=2XTXw−2XTy
∂‖Xw−y‖2∂w=∂(wTXTXw−yTXw−wTXTy+yTy)∂w=XTXw+(XTX)Tw−(yTX)T−XTy=2XTXw−2XTy
其中XTXw=(XTX)TwXTXw=(XTX)Tw.令求导结果等于0,即可以求导问题的最小值。
2XTXw−2XTy=0w=(XTX)−1XTy
2XTXw−2XTy=0w=(XTX)−1XTy
再利用最小二乘法的矩阵形式对前面的例子进行求解,用二阶多项式拟合即两个点(2,3),(5,8)(2,3),(5,8)。
表示输入矩阵 XX和标签向量yy
X=[1125425]y=[38]T
X=[1241525]y=[38]T
计算XTXXTX
XTX=⎡⎣⎢272972913329133641⎤⎦⎥
XTX=[272972913329133641]
矩阵求逆,再做矩阵乘法运算
但 XTXXTX不可逆,故无唯一解。
关于矩阵的逆是否存在,可以通过判断矩阵的行列式是否为0(det(A)=?0det(A)=?0 来判断,也可以通过初等行变换,观察矩阵的行向量是否线性相关,在这个例子下,矩阵不可逆,故有无穷多解。但如果新增一个点(4,7)(4,7),则就可以解了。
其实这和数据集的点数和选择的阶数有关,如果点数小于阶数则会出现无穷解的情况,如果点数等于阶数,那么刚好有解可以完全拟合所有数据点,如果点数大于阶数,则会求的近似解。
那么对于点数小于阶数的情况,如何求解?在python的多项式拟合函数中是可以拟合的,而且效果不错,具体算法不是很了解,可以想办法参考python的ployfit()函数的实现。
4. 拟合阶数的选择
在前面的推导中,多项式的阶数被固定了,那么实际场景下应该如何选择合适的阶数MM呢?
一般会选择阶数MM小于点数NN
把训练数据分为训练集合验证集,在训练集上,同时用不同的MM值训练多个模型,然后选择在验证集误差最小的阶数script type="math/tex" id="MathJax-Element-5573"M/script
python做科学计算的特点:1. 科学库很全。(推荐学习:Python视频教程)
科学库:numpy,scipy。作图:matplotpb。并行:mpi4py。调试:pdb。
2. 效率高。
如果你能学好numpy(array特性,f2py),那么你代码执行效率不会比fortran,C差太多。但如果你用不好array,那样写出来的程序效率就只能呵呵了。所以入门后,请一定花足够多的时间去了解numpy的array类。
3. 易于调试。
pdb是我见过最好的调试工具,没有之一。直接在程序断点处给你一个截面,这只有文本解释语言才能办到。毫不夸张的说,你用python开发程序只要fortran的1/10时间。
4. 其他。
它丰富而且统一,不像C++的库那么杂(好比pnux的各种发行版),python学好numpy就可以做科学计算了。python的第三方库很全,但是不杂。python基于类的语言特性让它比起fortran等更加容易规模化开发。
数值分析中,龙格-库塔法(Runge-Kutta methods)是用于非线性常微分方程的解的重要的一类隐式或显式迭代法。这些技术由数学家卡尔·龙格和马丁·威尔海姆·库塔于1900年左右发明。
龙格-库塔(Runge-Kutta)方法是一种在工程上应用广泛的高精度单步算法,其中包括著名的欧拉法,用于数值求解微分方程。由于此算法精度高,采取措施对误差进行抑制,所以其实现原理也较复杂。
高斯积分是在概率论和连续傅里叶变换等的统一化等计算中有广泛的应用。在误差函数的定义中它也出现。虽然误差函数没有初等函数,但是高斯积分可以通过微积分学的手段解析求解。高斯积分(Gaussian integral),有时也被称为概率积分,是高斯函数的积分。它是依德国数学家兼物理学家卡尔·弗里德里希·高斯之姓氏所命名。
洛伦茨吸引子及其导出的方程组是由爱德华·诺顿·洛伦茨于1963年发表,最初是发表在《大气科学杂志》(Journal of the Atmospheric Sciences)杂志的论文《Deterministic Nonperiodic Flow》中提出的,是由大气方程中出现的对流卷方程简化得到的。
这一洛伦茨模型不只对非线性数学有重要性,对于气候和天气预报来说也有着重要的含义。行星和恒星大气可能会表现出多种不同的准周期状态,这些准周期状态虽然是完全确定的,但却容易发生突变,看起来似乎是随机变化的,而模型对此现象有明确的表述。
更多Python相关技术文章,请访问Python教程栏目进行学习!以上就是小编分享的关于python能做什么科学计算的详细内容希望对大家有所帮助,更多有关python教程请关注环球青藤其它相关文章!
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流