0:介绍和课程地址
非常不自量力的开始学习机器学习了。
于是记个笔记,防止自己忘光。
课程是吴恩达老师2022年python版的:
01:监督学习和非监督学习
机器学习的两种形式
例如:
给定标记为垃圾邮件/非垃圾邮件的电子邮件,学习垃圾邮件过滤器———监督学习
给定一组新闻文章,将其分组——非监督学习
监督学习需要学习的数据集带有已知标签,而非监督学习则不需要。
02:线性回归模型和代价函数
线性回归模型是机器学习的一种简单模型,它以线性关系来拟合两个变量,例如房间大小和房价之间的关系。
回归模型得到的预测值y^=wx+b与真实值y之间的差表示了预测的准确程度,由此得到代价函数的概念。代价函数的公式为:
代价函数的最小值,就是模型y=wx+b拟合程度最好的地方。在本例中,代价函数J是关于w和b的函数。
如图所示,当J取最小值时,f的拟合程度最好。
03:梯度下降
概述
为了找到代价函数的最小值,可以使用梯度下降的办法。梯度下降在神经网络中的使用非常普遍。在上述案例中,梯度下降即是寻找代价函数J(w,b)的最小值的过程。
事实上,梯度下降是一种可以用来寻找任何函数最小值的算法,不只是线性回归函数。
进行梯度下降的基本思路是:从w和b的某个值开始,不断改变w和b的值,使代价函数J(w,b)减小,直到J稳定在或接近最小值。
实现梯度下降
梯度下降公式——以上述线性回归函数为例
式中a代表学习率,学习率意味着梯度下降的步幅大小。(a>0)
上图即本例中梯度下降的公式,通过以上公式不断迭代w和b的值,直到收敛(找到J的最小值)为止。
注意,在迭代过程中,w和b的值必须同时更新,不能出现w先变化而b不变的情况。
偏导项
梯度下降公式中的偏导项是符合直觉的。
对于一个过原点的线性回归函数,其代价函数的形状类似抛物线。设J取最小值时,w=w0。当w的值小于w0时,斜率小于0,偏导项小于0,w减去一个负数,迭代后w的值增加,反之亦然。
学习率
错误的学习率会使梯度下降无法正常工作,好的学习率会以更好的速度实现梯度下降。
如果学习率过小,梯度下降的速度会变得很慢;如果学习率过大,梯度下降会无法收敛,甚至会发散。
应用
对于简单的线性回归函数,其代价函数是凸函数,这意味着只要选取合适的学习率,梯度下降一定会收敛于全局最小值而非局部最小值。
案例:https://blog.csdn.net/aal779/article/details/106305703
栗子中的代码:
import numpy as np
import matplotlib.pyplot as plt
def costFunctionJ(x,y,theta):
'''代价函数'''
m = np.size(x, axis = 0)
predictions = x*theta #预测值
sqrErrors = np.multiply((predictions - y),(predictions - y))
j = 1/(2*m)*np.sum(sqrErrors)
return j
def gradientDescent(x,y,theta,alpha,num_iters):
'''
alpha为学习率
num_iters为迭代次数
'''
m = len(y)
n = len(theta)
temp = np.mat(np.zeros([n,num_iters])) # 用来暂存每次迭代更新的theta值,是一个矩阵形式
j_history = np.mat(np.zeros([num_iters,1])) # #记录每次迭代计算的代价值
for i in range(num_iters): # 遍历迭代次数
h = x*theta
#temp[0,i] = theta[0,0] - (alpha/m)*np.dot(x[:,1].T,(h-y)).sum()
#temp[1,i] = theta[1,0] - (alpha/m)*np.dot(x[:,1].T,(h-y)).sum()
temp[:,i] = theta - (alpha/m)*np.dot(x[:,1].T,(h-y)).sum()
theta = temp[:,i]
j_history[i] = costFunctionJ(x,y,theta)
return theta,j_history,temp
x = np.mat([1,3,1,4,1,6,1,5,1,1,1,4,1,3,1,4,1,3.5,1,4.5,1,2,1,5]).reshape(12,2)
theta = np.mat([0,2]).reshape(2,1)
y = np.mat([1,2,3,2.5,1,2,2.2,3,1.5,3,1,3]).reshape(12,1)
# 求代价函数值
j = costFunctionJ(x,y,theta)
#print('代价值:',j)
plt.figure(figsize=(15,5))
plt.subplot(1,2,1)
plt.scatter(np.array(x[:,1])[:,0],np.array(y[:,0])[:,0],c='r',label='real data') # 画梯度下降前的图像
plt.plot(np.array(x[:,1])[:,0],x*theta,label = 'test data')
plt.legend(loc = 'best')
plt.title('before')
theta, j_history, temp = gradientDescent(x,y,theta,0.01,100)
print('最终j_history值:\n',j_history[-1])
print('最终theta值:\n',theta)
print('每次迭代的代价值:\n',j_history)
print('theta值更新历史:\n',temp)
plt.subplot(1,2,2)
plt.scatter(np.array(x[:,1])[:,0],np.array(y[:,0])[:,0],c='r',label = 'real data') # 画梯度下降后的图像
plt.plot(np.array(x[:,1])[:,0],x*theta,label = 'predict data')
plt.legend(loc = 'best')
plt.title('after')
plt.show()
多个特征的梯度下降
具有多个特征的线性回归模型成为多元线性回归模型。其梯度下降的基本原理与单个特征的线性回归是相同的。
为了简化多元线性回归模型,可以使用向量表示其假设方程:
04:向量化
向量化可以帮助你减轻编写代码的复杂程度,也可以简化计算机的运算。
在python中,我们常常使用NumPy库进行数学计算。
例如:
w = np.array([1.0,2.5,-3.3]) #向量
b = 4 #单个数字
x = np.array([10,20,30])
根据向量化的思想,一个函数f(w,b)=w1x1+w2x2+w3x3+......+wnxn
可以写成:
f = np.dot(w,x)+b
Comments | 2 条评论
博主 1439429910
神!
博主 misaka10201
tql