机器学习—线性回归

£神魔★判官ぃ 2022-10-06 01:53 421阅读 0赞

花了2天时间看了吴恩达老师的机器学习算法的第一章,收获很多,在网易云课堂上可看,虽然是英文版的,且偏向于理论,故在此记录下学习收获和代码实现。

1.y=kx+b的线性回归

1.1导包与前序工作

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. # 1. 导入数据(两列)
  4. data=np.genfromtxt('csv/data.csv', delimiter=',')
  5. x_data=data[:,0]
  6. y_data=data[:,1]
  7. plt.scatter(x_data,y_data)
  8. plt.show()
  9. # 学习率learning rate(步长)、截距、斜率、最大迭代次数
  10. lr=0.0005
  11. b=1
  12. k=0
  13. epochs=5000

csv数据集
在这里插入图片描述

1.2代价函数

这里的代价函数为两点之间的距离差距的平方

  1. def compute_error(b,k,x_data,y_data):
  2. totalError=0
  3. for i in range(0,len(x_data)):
  4. totalError+=(y_data[i]-(k*x_data[i]+b))**2
  5. return totalError/float(len(x_data))

1.3 梯度下降算法

记录一个理解了好久才理解的点
1.梯度下降中,如下代码
k_grad+= -(1/m)x_data[j](y_data[j]-((k*x_data[j])+b))
是根据微积分中的偏导数求出来的,公式为
在这里插入图片描述
2.迭代更新时应该同时更新,而不是先更新k,再更新b

  1. def gradient_descent_runner(x_data,y_data,b,k,lr,epochs):
  2. # 总数据量
  3. m=float(len(x_data))
  4. # 迭代epochs次
  5. for i in range(epochs):
  6. b_grad=0
  7. k_grad=0
  8. for j in range(0,len(x_data)):
  9. b_grad+= -(1/m)*(y_data[j]-((k*x_data[j])+b))
  10. k_grad+= -(1/m)*x_data[j]*(y_data[j]-((k*x_data[j])+b))
  11. # 更新b和k
  12. b= b-(lr*b_grad)
  13. k= k-(lr*k_grad)
  14. # 每迭代500次,输出一次图像和数据
  15. if i%500 ==0:
  16. print('epochs:',i)
  17. print('b:',b,'k:',k)
  18. print('error:',compute_error(b,k,x_data,y_data),)
  19. plt.plot(x_data,y_data,'b')
  20. plt.plot(x_data,k*x_data+b,'r')
  21. plt.show()
  22. return b,k

1.4启动函数

  1. gradient_descent_runner(x_data,y_data,b,k,lr,epochs)

在这里插入图片描述
上面这些代码是看了某个csdn的大佬学过来的,所以可能有雷同,修改成了3元的,思路差不多

2 z=k1x+k2y+c的线性回归

  1. # 三元 z=b+k1x+k2y
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. # 1. 导入数据(两列)
  5. data=np.genfromtxt('csv/data2.csv', delimiter=',')
  6. x_data=data[:,0] # 冒号先后:从第0行取到最后一行,逗号后面0:只要第一列
  7. y_data=data[:,1]
  8. z_data=data[:,2]
  9. # 学习率learning rate(步长)、截距、斜率、最大迭代次数
  10. lr=0.0005
  11. b=1
  12. k1=0
  13. k2=0
  14. epochs=100000
  15. # 2. 代价函数(最小二乘法):该函数只返回一个值
  16. def compute_error(b,k1,k2,x_data,y_data,z_data):
  17. totalError=0
  18. for i in range(0,len(x_data)):
  19. totalError+=(z_data[i]-(k1*x_data[i]+k2*y_data[i]+b))**2
  20. return totalError/float(len(x_data))
  21. # 3. 梯度降低算法函数
  22. def gradient_descent_runner(x_data,y_data,z_data,b,k1,k2,lr,epochs):
  23. # 总数据量
  24. m=float(len(x_data))
  25. # 迭代epochs次
  26. for i in range(epochs):
  27. b_grad=0
  28. k1_grad=0
  29. k2_grad=0
  30. for j in range(0,len(x_data)):
  31. b_grad+= -(1/m)*(z_data[j]-((k1*x_data[j])+(k2*y_data[j])+b))
  32. k1_grad+= -(1/m)*x_data[j]*(z_data[j]-((k1*x_data[j])+(k2*y_data[j])+b))
  33. k2_grad+= -(1/m)*y_data[j]*(z_data[j]-((k1*x_data[j])+(k2*y_data[j])+b))
  34. # 更新b和k
  35. b= b-(lr*b_grad)
  36. k1= k1-(lr*k1_grad)
  37. k2= k2-(lr*k2_grad)
  38. # 每迭代500次,输出一次图像和数据
  39. if i%5000 ==0:
  40. print('epochs:',i)
  41. print('b:',b,'k1:',k1,'k2:',k2)
  42. print('error:',compute_error(b,k1,k2,x_data,y_data,z_data),)
  43. return b,k1,k2
  44. gradient_descent_runner(x_data,y_data,z_data,b,k1,k2,lr,epochs)

数据集
在这里插入图片描述
记录两个学习到的点
1.当特征值比较相似的时候,梯度下降收敛比较快,如果两个特征值相差过于大,可以使用特征缩放的方式来解决这个问题,譬如k1为[1,5],k2为[1000,2000],
可都缩放为[-1,1]这样。
2.学习率不应该过大。

刚刚考研上岸的准研究生,刚刚涉猎,如有不对,感谢指出。

发表评论

表情:
评论列表 (有 0 条评论,421人围观)

还没有评论,来说两句吧...

相关阅读

    相关 机器学习 --- 线性回归

    线性回归是属于机器学习里面的监督学习,与分类问题不同的是,在回归问题中,其目标是通过对训练样本的学习,得到从样本特征到样本标签直接的映射,其中,在回归问题中,样本的标签是连续值

    相关 机器学习线性回归

    花了2天时间看了吴恩达老师的机器学习算法的第一章,收获很多,在网易云课堂上可看,虽然是英文版的,且偏向于理论,故在此记录下学习收获和代码实现。 1.y=kx+b的线性回归

    相关 机器学习线性回归

    单变量线性回归 说到机器学习的话,很多人首先会想到的是单变量的线性回归,好像大家高中的时候都学过。很多人不理解,这种线性回归的东西跟机器学习有什么关系。 其实单变量的话

    相关 机器学习_线性回归

    这学期打算把机器学习和深度学习 什么是回归算法 1. 回归算法是一种有监督算法(有一个x和y的对应关系) 2. 回归算法是一种比较常用的机器学习算法,用来建立“解释