这一篇博文是【 AI学习路线图】系列文章的其中一篇,点击查看目录:AI学习完整路线图
π是圆的周长与直径的比值,是一个常数,是个无限不循环小数,是个无理数。
公式为: π4=limn→∞∑ni=0(−1)i12i+1
根据公式计算π:
import numpy as np
# 求π的值,递归方式
def pi(n, i=0, m=0.0):
if n == i:
return m + 1.0 * np.power(-1, i) / (2 * i + 1)
else:
return pi(n, i + 1, m + 1.0 * np.power(-1, i) / (2 * i + 1))
# 求π的值,循环方式
def pi2(n):
m = 0
for i in range(n + 1):
m = m + np.power(-1, i) / (2.0 * i + 1)
return m
# 递归方式下,Python有递归次数的限制,太多不行
# print("递归方式:", pi(999999) * 4)
#循环的次数越多,结果越精确
print("循环方式:", pi2(999999) * 4)
#--------------------------------------------
#输出为:
循环方式: 3.14159165359
e是自然常数,简单讲e表示的是增长极限,也就是单位时间内,持续地翻倍增长所能达到的增长率的极限值,e是自然对数的底数,e是个无理数,约等于2.718281828
公式为: limn→∞(1+1n)n
根据公式计算e:
def e(n):
return pow(1 + 1.0 / n, n)
print("e约等于:", e(99999999999))
#-------------------
#输出为:
e约等于: 2.7182820533299275
指数的表示为: y=ax,a
指数相乘: ax×ay=a(x+y)
指数相除: axay=a(x−y)
注意: a0=1
用python画指数函数:
import math
import matplotlib.pyplot as plt
import numpy as np
def zhi():
x = np.arange(-2, 2, 0.01)
y1 = [math.pow(0.5, i) for i in x]
ye = [math.pow(math.e, i) for i in x]
y5 = [math.pow(5, i) for i in x]
plt.plot(x, y1, color='r', label='$0.5^x$')
plt.plot(x, ye, color='g', label='$e^x$')
plt.plot(x, y5, color='b', label='$5^x$')
plt.legend(loc='best')
plt.grid(True)
plt.show()
zhi()
结果为:
对数函数表示为: y=loga(x),a>0,a≠1
对数相加公式: loga(x)+loga(y)=loga(x∗y)
对数相减公式: loga(x)−loga(y)=loga(xy)
注意: loga(1)=0
用Python画对数曲线:
import math
import matplotlib.pyplot as plt
import numpy as np
def log():
x = np.arange(0.05, 5, 0.01)
y5 = [math.log(i, 0.5) for i in x]
ye = [math.log(i, math.e) for i in x]
y10 = [math.log(i, 10) for i in x]
plt.plot(x, y5, color='y', label='\log0.5(x)')
plt.plot(x, ye, color='r', label='\loge(x)')
plt.plot(x, y10, color='g', label='\log10(x)')
plt.legend(loc='lower right')
plt.xlim(0, 5)
plt.ylim(-5, 5)
plt.grid(True)
plt.show()
log()
结果为:
导数就是曲线的斜率,是曲线变化快慢的反映。
二阶导数是斜率变化的反映,表征曲线是凹凸性
导函数 y=f(x) 的自变量x在一个点x0上产生一个增量∆x时候,函数的输出值的增量∆y与自变量的增量∆x的比值在∆x趋近于0时的极限值a如果存在,a即为函数f在x0处的导数,记作 f′(x0) 或者 df(x0)dx
导数是函数的局部性质,一个函数在某一个点的导数描述了这个函数在这个点附近的变化率,也就是函数所代表的曲线在这个点的切线斜率。
可导的函数一定连续,不连续的函数一定不可导。
函数 y=f(x) 的导数可以用以下几种公式表示:
y
单调性:若导数大于0,则单调递增;若导数小于0,则单调递减; 若导数为0,则为函数的驻点。
单调区间:如果在函数的某一区间中,导数横大于0(或者恒小于0),则函数在这个区间内是单调递增(或者单调递减),这个区间叫做单调区间。
驻点:导函数值等于0的点称为函数的驻点。
极大值点:如果一个驻点之前的区间上导函数值都大于0,之后的区间上导函数的值都小于0,这个点就是极大值点。
极小值点:如果一个驻点之前的区间上导函数的值都小于0,之后的区间上导函数的值都大于0,这个点就是极小值点。
导数实例:
import matplotlib.pyplot as plt
import numpy as np
# 原来的函数
def f(x):
return 3 * x * x + 5 * x + 8
# 导函数
# 上面函数f(x)的导数为 6*x+5
def d(x):
return 6 * x + 5
# 画出原函数和导函数的曲线
def tod():
x = np.arange(-4, 2.4, 0.05)
y = [f(i) for i in x]
y2 = [d(i) for i in x]
plt.plot(x, y, color='r', label='$f(x)=3*x^2 + 5*x +8$')
plt.plot(x, y2, color='g', label='$\\frac{dy}{dx}=6*x+5$')
plt.legend(loc='best')
plt.grid(True)
plt.show()
tod()
结果为:
使用函数的二阶导函数来判断函数的凹凸性,如果二阶导函数的值在一个区间内横大于0,那么在这个区间上函数是凸的,反之是凹的,曲线的凹凸分界点称为曲线的拐点。
若函数f的定义域C为凸集,而且满足条件: ∀x,y∈C,0≤θ≤1 ,且有: f(θx+(1−θ)y)≤θf(x)+(1−θ)f(y)
以上也可以定义为:对曲线上的任意两点的连线上的点对应的函数值不大于该两点对应函数值连线上的值。
凸函数的充要条件是:一阶导数是递增函数、二阶导数值大于0
注意:对于凸函数问题而言,局部的最优解就是全局的最优解。这一点在逻辑回归中要用到。
常数C的导数:常数的导数为常数0。 C′=0
幂函数的导数:是将n拿下来,再乘以x的n-1次方。 (xn)′=n⋅xn−1
指数函数的导数: (ax)′=ax⋅lna
自然指数函数的导数:为它本身。 (ex)′=ex
sin函数的导数: (sin(x))′=cos(x)
cos函数的导数: (cos(x))′=−sin(x)
对数函数的导数: (logax)′=1xlna
函数加减乘除的导数:
(1) 两个数的相加减的导数就是他们分别导数的相加减。 (u±v)′=u′±v′
(2) u和v两个数的相乘的导数就是u的导数乘以v加上u乘以v的导数。 (u⋅v)′=u′v+uv′
(3) u和v两个数的相除的导数: (uv)′=u′v−uv′v2
复合函数的导数:
复合函数是一个函数套一个函数,他的导数是先求外层函数的导数,再乘以内层函数的导数。
y=f(g(x))⟹y′=dfdg⋅dgdx
在多变量的函数中,偏导数就是关于其中一个变量的导数。比如函数: z=f(x,y)
点(x0,y0)是其定义域内的一个点,如果求x的偏导数,那么就固定y=y0,求这一点上对x的导数,如果求y的偏导数,那么就固定x=x0,求这一点上对y的导数。
偏导数是体现了在一个坐标轴上的变化率,而方向导数就是函数在其他特定方向上的变化率。
如果函数 z=f(x,y)
在点P(x,y)是可微分的(即可导的),那么函数在该点沿着任意一个方向v的方向导数都存在。
梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向变化最快,变化率最大。
设函数 z=f(x,y) 在平面区域D内具有一阶连续偏导数,则对于每个点P(x,y)并且这个点在区域D内,向量
(αfαx,αfαy)
为函数在点P的梯度,记作gradf(x,y)。
梯度可以理解为偏导的方向。
梯度下降是一种最优化算法,通常被称为最速下降法。梯度下降法是根据负梯度方向为搜索方向,越接近目标值,步长越小,前进越慢。
缺点是靠近极小值时收敛比较慢;可能会出现之字形下降;不太适合处理比较复杂的非线性函数问题。
泰勒公式是一个用函数在某点的信息描述其附近取值的公式。如果函数足够平滑的话,在已知函数在某一点的各阶导数值的情况之下,泰勒公式可以用这些导数值做系数构建一个多项式来近似函数在这一点的邻域中的值。
设 n 是一个正整数,如果定义在一个包含 a 的区间上的函数 f 在 a 点处 n+1 次可导,那么对于这个区间上的任意x都有:
f(x)=∑Nn=0fn(a)n!(x−a)n+Rn(x)
其中的多项式称为函数在a处的泰勒展开式,后面部分是泰勒公式的余项且是 (x−a)n 的高阶无穷小。
泰勒公式一句话描述:就是用多项式函数去逼近光滑函数。
常用的余项有:
余项是计算的偏移量。