1.导数的数学意义
设函数 y=f(x)在点 x0 的某个邻域内有定义,当自变量x 在x0处有增量Δx,(x0+Δx)也在该邻域内时,相应地函数取得增量Δy=f(x0+Δx)-f(x0);如果Δy与Δx之比当Δx→0时极限存在,则称函数y=f(x)在点x0处可导,并称这个极限为函数y=f(x)
导数的数学意义可以理解为在某一点上去极端值后的k
2.导数的几何意义
函数y=f(x)在x0点的导数 f’(x0)的几何意义:表示函数曲线在点P0(x0,f(x0))处的切线的斜率
导数的几何意义是该函数曲线在这一点上的切线斜率
3.导数的物理意义
导数可以表示运动物体的瞬时速度和加速度(就直线运动而言,位移关于时间的一阶导数是瞬时速度,二阶导数是加速度),可以表示曲线在一点的斜率。
4.基本求导公式
深度建议您对以下公式有所了解,以便于您在以后的学习中熟练掌握
这是对向量进行基本公式求导的过程。您可以直接将相关数据套入相应公式即可求导。
5.函数的和、差、积、商的求导法则
6.复合函数的求导法则
7.求导训练
1. x4 = 4x4-1=4x3
2. x4 + x3 +x +15 = 4x3 + 3x2 + 1
3. (2x+3)4 = 83 (逐级求导,链式法则)
f(x) = 2x+3 = 2 g(x) = x4 = 4x3
8.偏导数
函数z = f(x,y) 在 (x0,y0) 处对x的偏导数
实际上是把y固定在y0并且看为常数后,一元函数 z = f(x,y0) 在
9.偏导计算
请你手算f(x,y)=x^3 y+y^2
对X求偏导
(cx)3 ‘
=c(x3)
=3x2y
c ‘= 0
对Y求偏导
(cy)’
=c(y1-1)
=c*1*(y0)
=c
(y2)’
=2y
10.梯度
梯度是一个向量,一个函数在某点的梯度,代表这个函数在某点沿着梯度方向的变化最快(沿着梯度方向的导数达到最大值)
如果有一个曲面w=(x,y,z),梯度∇w=<∂w/∂x,∂w/∂y,∂w/∂z>综合了所有偏导数的向量。
(在单变量的实值函数中,某点的梯度就是该点的导数,表示为该点的切线斜率)
11.方向导数
w=(x,y)的偏导w_x与w_y分别描述了其在x轴和y轴方向移动时w的变化,如果点在其他方向移动呢?是否在任意方向都有一个导数呢?
12.梯度下降
梯度下降法的基本思想可以类比为一个下山的过程。假设这样一个场景:一个人被困在山上,他利用梯度下降算法来帮助自己快速下山。具体来说就是,以他当前的所处的位置为基准,寻找这个位置最陡峭的地方,然后朝着山的高度下降的地方走,最后就能成功高效地抵达山谷。
梯度——变化最快的方向
(求偏导过程)在θt方向上 步长为α(非常非常小的数) 损失函数(目标函数)J
12.实践阶段——预测利润
1.MSE损失函数
为了促进在求偏导过程中找到最快的下降方向,我们需要引入损失函数。通过如上的更新公式,在训练过程中逐渐迭代调整模型参数,来逐渐优化此时的参数值(如α)。通过多次迭代执行更新公式,最终可以得到最优的模型参数值,使得模型可以在新的数据上获得较好的性能和泛化能力。
13.实践探究
1. 导入相关数据集
让我们接着上节课的实践过程继续,第一步仍然是读入相关数据集。
import numpy as np
import matplotlib.pyplot as plt
#读取数据集中数据,第一列是人口数据,第二列是利润数据
data = np.loadtxt(r"C:\Users\m1355\Downloads\ex1data1.txt",delimiter=",",dtype="float")
m = np.size(data,0) #0 data raw number
#注意要改到自己的路径下哦,文件在下方下载
data (下载0)
2. 绘制数据集样本点
(详细内容可参见上一课的教程)
我们读取了刚刚传入的数据集的尺寸大小,并且读入相应数据
然后再创建一个plot窗口,最后描绘所有点至窗口上
X = data[:,0] print(type(X)) print(X.ndim) X = data[:,0:1]#X[:,m:n],即取所有数据的第m到n-1列数据,含左不含右 y = data[:,1:2] print(type(X)) print(X.ndim) plt.plot(X,y,"rx") plt.xlabel('Population of City in 10,000s') plt.ylabel('Profit in $10,000s') plt.show()
3. 定义平方误差损失函数函数
接下来,我们尝试定义了一个损失函数用于评估预测值和真实值之间的差异。
def computeCost(X, y, theta):
m = np.size(X[:,0])
#print('this ',X.shape) (97 2)
J = 1/(2*m)*np.sum((np.dot(X,theta)-y)**2)
return J
在函数内部,首先通过np.size(X[:,0])计算出样本数m。然后,利用当前参数theta对特征矩阵X进行预测,得到一个m×1的向量(即np.dot(X,theta))。接着,将预测值与真实标签值之间的差值平方,然后对所有样本进行累加并求均值,从而得到当前模型的平方误差损失值J。
具体来说,平方误差损失函数的定义如下:
J(θ)=1/2m * ∑(hΘ(xi)-yi)^2
4. 进行梯度下降计算局部最优解
终于来到了今天重点讲解的部分——梯度下降
首先,我们在第一步中创建了一个全1向量one,然后将其插入特征矩阵中。
这个特征矩阵在接下来的梯度下降中,我们将尽可能的对其进行处理以得到最优解
one = np.ones(m)
X1 = np.insert(X,0,values=one,axis=1)
print(X1)
可能你会疑惑特征矩阵是什么?
特征矩阵是指用来描述一个样本的特征信息的矩阵,通常用X表示。在机器学习中,我们通常会将每个样本的特征表示为一个向量,将多个样本的特征向量按行排列组成特征矩阵X。
然后,我们需要定义一些参数:
初始化模型的参数theta为一个(2,1)的零向量
设置学习率alpha=0.01
调整迭代次数iterations=5 (可以尝试不同的迭代次数,可能会带来不同的结果)
创建一个用于保存每次迭代损失函数值的数组J_history
theta = np.zeros((2,1)) print(theta) iterations = 5 alpha = 0.01 print(X.shape) print(theta.shape) J_history = np.zeros((iterations,1))
接着,开始使用for循环实现多次迭代的梯度下降更新过程。在每次迭代中,根据当前参数theta和特征矩阵X1对样本的预测值进行计算,并计算预测值与真实标签之间的误差,然后根据梯度下降更新公式,对模型参数theta进行调整。
for iter in range(0,iterations): theta = theta - alpha/m*np.dot(X1.T,(np.dot(X1,theta)-y)) J_history[iter] = computeCost(X1,y,theta)
这里的更新公式就是我刚刚在前面提及的更新公式,
表达式为:θj:=θj-α/m*∑(hΘ(xi)-yi)*xi(j)
在代码中的体现为:theta = theta – alpha/m*np.dot(X1.T,(np.dot(X1,theta)-y))
其中,α为学习率,m为样本数,xi为第i个样本的特征向量,hΘ(xi)为根据当前参数θ对第i个样本的预测值,yi为第i个样本的真实标签值。
在实现中,我们可以使用向量化的方式,简化计算过程。
在每次迭代中,将当前计算得到的损失函数值保存在J_history数组中,以便后续可视化分析。
最后,利用计算出的参数theta绘制样本点及线性回归模型的拟合曲线,并输出迭代过程中损失函数值的变化情况和训练得到的模型参数。
plt.plot(data[:,0],np.dot(X1,theta),'*') plt.plot(X,y,"rx") plt.xlabel('Population of City in 10,000s') plt.ylabel('Profit in $10,000s') plt.show() print(J_history[:,0:1]) print(theta[0][0])
现在,我们可以尝试运行整段代码了。最后结果输出如下:
恭喜你,在你完成了今天的学习之后,你学会了导数,偏导数的相关知识和多种求导方法。
脑子烧了