程序所用文件:https://files.cnblogs.com/files/henuliulei/%E5%9B%9E%E5%BD%92%E5%88%86%E7%B1%BB%E6%95%B0%E6%8D%AE.zip

线性回归

决定系数越接近一那么预测效果越好

对于多元线性回归和一元线性回归推导理论是一致的,只不过参数是多个参数而已

梯度下降

梯度下降法存在局部最小值

太小迭代次数多,太大将无法迭代到最优质

梯度下降发容易到达局部最小值

凸函数使用局部下降法一定可以到全部最小值,所以不存在局部最小值才可以

下面两个demo是一元函数的拟合

1使用梯度下降法的数学公式进行的机器学习代码

  1. import numpy as np
  2. from matplotlib import pyplot as plt
  3. #读取数据
  4. data = np.genfromtxt('data.csv',delimiter=',')
  5. x_data = data[:, ]
  6. y_data = data[:, ]
  7. #plt.scatter(x_data, y_data)
  8. #plt.show()
  9. lr = 0.0001
  10. k =
  11. b =
  12. epochs =
  13. def compute_loss(x_data, y_data, b, k):#计算损失函数
  14. m = float(len(x_data))
  15. sum =
  16. for i in range(, len(x_data)):
  17. sum += (y_data[i] - (k*x_data[i] + b))**
  18. return sum/(*m)
  19. def gradient(x_data, y_data, k, b, lr, epochs):#进行梯度下降
  20. m = float(len(x_data))
  21.  
  22. for i in range(,epochs):
  23. k_gradient =
  24. b_gradiet =
  25. for j in range(,len(x_data)):
  26. k_gradient += (/m)*((x_data[j] * k + b) - y_data[j])
  27. b_gradiet += (/m)*((x_data[j] * k + b) - y_data[j]) * x_data[j]
  28. k -= lr * k_gradient
  29. b -= lr * b_gradiet
  30.  
  31. if i % == :
  32. print(i)
  33. plt.plot(x_data, y_data, 'b.')
  34. plt.plot(x_data, k*x_data + b, 'r')
  35. plt.show()
  36.  
  37. return k, b
  38.  
  39. k,b = gradient(x_data, y_data, , , lr, epochs)
  40. plt.plot(x_data, k * x_data + b, 'r')
  41. plt.plot(x_data, y_data, 'b.')
  42. print('loss =:',compute_loss(x_data, y_data, b, k),'b =:',b,'k =:',k)
  43. plt.show()

2 使用Python的sklearn库

  1. import numpy as np
  2. from matplotlib import pyplot as plt
  3. from sklearn.linear_model import LinearRegression
  4. #读取数据
  5. data = np.genfromtxt('data.csv',delimiter=',')
  6. x_data = data[:, ]
  7. y_data = data[:, ]
  8. plt.scatter(x_data, y_data)
  9. plt.show()
  10. x_data = data[:, , np.newaxis]#使一位数据编程二维数据
  11. y_data = data[:, , np.newaxis]
  12. model =LinearRegression()
  13. model.fit(x_data, y_data)#传进的参数必须是二维的
  14. plt.plot(x_data, y_data, 'b.')
  15. plt.plot(x_data, model.predict(x_data), 'r')#画出预测的线条
  16. plt.show()

3使用梯度下降法完成多元线性回归(以二元为例)

  1. import numpy as np
  2. from numpy import genfromtxt
  3. import matplotlib.pyplot as plt
  4. from mpl_toolkits.mplot3d import Axes3D #用来画3D图的包
  5. # 读入数据
  6. data = genfromtxt(r"Delivery.csv",delimiter=',')
  7. print(data)
  8. # 切分数据
  9. x_data = data[:,:-]
  10. y_data = data[:,-]
  11. print(x_data)
  12. print(y_data)
  13. # 学习率learning rate
  14. lr = 0.0001
  15. # 参数
  16. theta0 =
  17. theta1 =
  18. theta2 =
  19. # 最大迭代次数
  20. epochs =
  21.  
  22. # 最小二乘法
  23. def compute_error(theta0, theta1, theta2, x_data, y_data):
  24. totalError =
  25. for i in range(, len(x_data)):
  26. totalError += (y_data[i] - (theta1 * x_data[i,] + theta2*x_data[i,] + theta0)) **
  27. return totalError / float(len(x_data))
  28.  
  29. def gradient_descent_runner(x_data, y_data, theta0, theta1, theta2, lr, epochs):
  30. # 计算总数据量
  31. m = float(len(x_data))
  32. # 循环epochs次
  33. for i in range(epochs):
  34. theta0_grad =
  35. theta1_grad =
  36. theta2_grad =
  37. # 计算梯度的总和再求平均
  38. for j in range(, len(x_data)):
  39. theta0_grad += (/m) * ((theta1 * x_data[j,] + theta2*x_data[j,] + theta0) - y_data[j])
  40. theta1_grad += (/m) * x_data[j,] * ((theta1 * x_data[j,] + theta2*x_data[j,] + theta0) - y_data[j])
  41. theta2_grad += (/m) * x_data[j,] * ((theta1 * x_data[j,] + theta2*x_data[j,] + theta0) - y_data[j])
  42. # 更新b和k
  43. theta0 = theta0 - (lr*theta0_grad)
  44. theta1 = theta1 - (lr*theta1_grad)
  45. theta2 = theta2 - (lr*theta2_grad)
  46. return theta0, theta1, theta2
  47. print("Starting theta0 = {0}, theta1 = {1}, theta2 = {2}, error = {3}".
  48. format(theta0, theta1, theta2, compute_error(theta0, theta1, theta2, x_data, y_data)))
  49. print("Running...")
  50. theta0, theta1, theta2 = gradient_descent_runner(x_data, y_data, theta0, theta1, theta2, lr, epochs)
  51. print("After {0} iterations theta0 = {1}, theta1 = {2}, theta2 = {3}, error = {4}".
  52. format(epochs, theta0, theta1, theta2, compute_error(theta0, theta1, theta2, x_data, y_data)))
  53. ax = Axes3D(plt.figure())#和下面的代码功能一样
  54. #ax = plt.figure().add_subplot(, projection='3d')#plt.figure().add_subplot和plt.subplot的作用是一致的
  55. ax.scatter(x_data[:, ], x_data[:, ], y_data, c='r', marker='o', s=) # 点为红色三角形
  56. x0 = x_data[:, ]
  57. x1 = x_data[:, ]
  58. # 生成网格矩阵
  59. x0, x1 = np.meshgrid(x0, x1)#生成一个网格矩阵,矩阵的每个点的第一个轴的取值来自于x0范围内,第二个坐标轴的取值来自于x1范围内
  60. z = theta0 + x0 * theta1 + x1 * theta2
  61. # 画3D图
  62. ax.plot_surface(x0, x1, z)
  63. # 设置坐标轴
  64. ax.set_xlabel('Miles')
  65. ax.set_ylabel('Num of Deliveries')
  66. ax.set_zlabel('Time')
  67.  
  68. # 显示图像
  69. plt.show()

4:使用Python的sklearn库完成多元线性回归

  1. import numpy as np
  2. from numpy import genfromtxt
  3. from sklearn import linear_model
  4. import matplotlib.pyplot as plt
  5. from mpl_toolkits.mplot3d import Axes3D
  6. # 读入数据
  7. data = genfromtxt(r"Delivery.csv",delimiter=',')
  8. print(data)
  9. # 切分数据
  10. x_data = data[:,:-]
  11. y_data = data[:,-]
  12. print(x_data)
  13. print(y_data)
  14. # 创建模型
  15. model = linear_model.LinearRegression()
  16. model.fit(x_data, y_data)
  17. # 系数
  18. print("coefficients:",model.coef_)
  19.  
  20. # 截距
  21. print("intercept:",model.intercept_)
  22.  
  23. # 测试
  24. x_test = [[,]]
  25. predict = model.predict(x_test)
  26. print("predict:",predict)
  27. ax = plt.figure().add_subplot(, projection='3d')
  28. ax.scatter(x_data[:, ], x_data[:, ], y_data, c='r', marker='o', s=) # 点为红色三角形
  29. x0 = x_data[:, ]
  30. x1 = x_data[:, ]
  31. # 生成网格矩阵
  32. x0, x1 = np.meshgrid(x0, x1)
  33. z = model.intercept_ + x0*model.coef_[] + x1*model.coef_[]
  34. # 画3D图
  35. ax.plot_surface(x0, x1, z)#参数是二维的,而model.prodict(x_data)是一维的。
  36. # 设置坐标轴
  37. ax.set_xlabel('Miles')
  38. ax.set_ylabel('Num of Deliveries')
  39. ax.set_zlabel('Time')
  40.  
  41. # 显示图像
  42. plt.show()

5 多项式回归拟合

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from sklearn.preprocessing import PolynomialFeatures#多项式
  4. from sklearn.linear_model import LinearRegression
  5.  
  6. # 载入数据
  7. data = np.genfromtxt("job.csv", delimiter=",")
  8. x_data = data[:,]
  9. y_data = data[:,]
  10. plt.scatter(x_data,y_data)
  11. plt.show()
  12. x_data
  13. x_data = x_data[:,np.newaxis]
  14. y_data = y_data[:,np.newaxis]
  15. x_data
  16. # 创建并拟合模型
  17. model = LinearRegression()
  18. model.fit(x_data, y_data)
  19. # 画图
  20. plt.plot(x_data, y_data, 'b.')
  21. plt.plot(x_data, model.predict(x_data), 'r')
  22. plt.show()
  23. # 定义多项式回归,degree的值可以调节多项式的特征
  24. poly_reg = PolynomialFeatures(degree=)
  25. # 特征处理
  26. x_poly = poly_reg.fit_transform(x_data)
  27. # 定义回归模型
  28. lin_reg = LinearRegression()
  29. # 训练模型
  30. lin_reg.fit(x_poly, y_data)
  31. # 画图
  32. plt.plot(x_data, y_data, 'b.')
  33. plt.plot(x_data, lin_reg.predict(poly_reg.fit_transform(x_data)), c='r')
  34. plt.title('Truth or Bluff (Polynomial Regression)')
  35. plt.xlabel('Position level')
  36. plt.ylabel('Salary')
  37. plt.show()
  38. # 画图
  39. plt.plot(x_data, y_data, 'b.')
  40. x_test = np.linspace(,,)
  41. x_test = x_test[:,np.newaxis]
  42. plt.plot(x_test, lin_reg.predict(poly_reg.fit_transform(x_test)), c='r')
  43. plt.title('Truth or Bluff (Polynomial Regression)')
  44. plt.xlabel('Position level')
  45. plt.ylabel('Salary')
  46. plt.show()
 

线性回归和梯度下降代码demo的更多相关文章

  1. 机器学习算法整理(一)线性回归与梯度下降 python实现

    回归算法 以下均为自己看视频做的笔记,自用,侵删! 一.线性回归 θ是bias(偏置项) 线性回归算法代码实现 # coding: utf-8 ​ get_ipython().run_line_mag ...

  2. 线性回归、梯度下降(Linear Regression、Gradient Descent)

    转载请注明出自BYRans博客:http://www.cnblogs.com/BYRans/ 实例 首先举个例子,假设我们有一个二手房交易记录的数据集,已知房屋面积.卧室数量和房屋的交易价格,如下表: ...

  3. Andrew Ng机器学习公开课笔记 -- 线性回归和梯度下降

    网易公开课,监督学习应用.梯度下降 notes,http://cs229.stanford.edu/notes/cs229-notes1.pdf 线性回归(Linear Regression) 先看个 ...

  4. 斯坦福机器学习视频笔记 Week1 线性回归和梯度下降 Linear Regression and Gradient Descent

    最近开始学习Coursera上的斯坦福机器学习视频,我是刚刚接触机器学习,对此比较感兴趣:准备将我的学习笔记写下来, 作为我每天学习的签到吧,也希望和各位朋友交流学习. 这一系列的博客,我会不定期的更 ...

  5. Machine Learning--week2 多元线性回归、梯度下降改进、特征缩放、均值归一化、多项式回归、正规方程与设计矩阵

    对于multiple features 的问题(设有n个feature),hypothesis 应该改写成 \[ \mathit{h} _{\theta}(x) = \theta_{0} + \the ...

  6. 2018.4.23-ml笔记(线性回归、梯度下降)

    线性回归:找到最合适的一条线来最好的拟合我们的数据点. hθ(x) = θixi=θTx    θ被称之为权重参数    θ0为拟合参数 对每个样本yi=θTxi + εi    误差ε是独立并且具有 ...

  7. 线性回归与梯度下降(ML作业)

    Loss函数 题目一:完成computeCost.m function J = computeCost(X, y, theta) %COMPUTECOST Compute cost for linea ...

  8. 机器学习算法(优化)之一:梯度下降算法、随机梯度下降(应用于线性回归、Logistic回归等等)

    本文介绍了机器学习中基本的优化算法—梯度下降算法和随机梯度下降算法,以及实际应用到线性回归.Logistic回归.矩阵分解推荐算法等ML中. 梯度下降算法基本公式 常见的符号说明和损失函数 X :所有 ...

  9. 从梯度下降到Fista

    前言: FISTA(A fast iterative shrinkage-thresholding algorithm)是一种快速的迭代阈值收缩算法(ISTA).FISTA和ISTA都是基于梯度下降的 ...

随机推荐

  1. 漏洞验证系列--MongoDB未授权访问

    本系列文章旨在对于有一定网络安全基础的人员,在日常工作中扫描出来的各种漏洞,如何进行验证,以区分该漏洞是否存在或是扫描器误报.请勿应用非法途径. 本漏洞是由于MongoDB未设置访问权限,用户可以直接 ...

  2. 面试系列38 分库分表之后,id主键如何处理?

    (1)数据库自增id 这个就是说你的系统里每次得到一个id,都是往一个库的一个表里插入一条没什么业务含义的数据,然后获取一个数据库自增的一个id.拿到这个id之后再往对应的分库分表里去写入. 这个方案 ...

  3. SPRING+JPA+Hibernate配置方法

    1.applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans ...

  4. uboot 的启动过程及工作原理

    启动模式介绍 大多数 Boot Loader 都包含两种不同的操作模式:"启动加载"模式和"下载"模式,这种区别仅对于开发人 员才有意义.但从最终用户的角度看, ...

  5. ios 中倒计时计算,时间戳为NaN

    // 倒计时 daojishi(params) { let _this = this; let datetemp = this.servertimes; let lasttime = Date.par ...

  6. Windows 设置内网和外网同时使用

    想要电脑同时使用内网和外网必须具备两个网卡,一个是无线网卡一个是本地连接,无线网卡用来连接wifi也就是外网,而本地连接需要网线连接内网,外网是不需要做设置的,我们只需要设置内网即可,鼠标右击电脑右下 ...

  7. thinkphp 模型定义

    模型定义 模型类并非必须定义,只有当存在独立的业务逻辑或者属性的时候才需要定义. 模型类通常需要继承系统的\Think\Model类或其子类,下面是一个Home\Model\UserModel类的定义 ...

  8. Linux下编译VLC for Android源代码总结

    转:http://blog.chinaunix.net/uid-26611383-id-3678766.html 由于项目需要,需要一个在android平台能够支持RTSP协议的播放器,由于之前没有a ...

  9. CreateRemoteThread简单应用

    要实现线程的远程注入必须使用Windows提供的CreateRemoteThread函数来创建一个远程线程 该函数的原型如下: HANDLE CreateRemoteThread(      HAND ...

  10. Acess link