草庐IT

吴恩达机器学习--线性回归

Want595 2023-06-21 原文

文章目录

前言

线性回归:是一种通过属性的线性组合来进行预测的线性模型
其目的是找到一条直线或者一个平面或者更高维的超平面,使得预测值与真实值之间的误差最小化。

一、单变量线性回归

1.导入必要的库

导入pandas、numpy和matplotlib.pyplot库

import pandas as pd  #导入pandas库
import numpy as np   #导入numpy库
import matplotlib.pyplot as plt   #导入matplotlib.pyplot库
plt.rcParams['font.sans-serif']=['SimHei']   #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False    #用来正常显示负号

2.读取数据

使用pandas库的read_csv()函数读取数据文件,数据文件中包含了人口和收益两列数据

data=pd.read_csv(r"d:线性回归/regress_data1.csv")   #读取数据

3.绘制散点图

使用data.plot()函数绘制散点图,展示人口与收益之间的关系

data.plot(kind="scatter",x="人口",y="收益")    #绘制散点图
plt.xlabel("人口",fontsize=10)                 #横坐标
plt.ylabel("收益",fontsize=10)                 #纵坐标
plt.title("人口与收益之间的关系")              #标题
plt.show()     #画图

4.划分数据

这里是为了方便后面计算,将一列全为1的列插入到数据中
将数据分为训练集和测试集,这里只使用了训练集

data.insert(0,"ones",1)    #插入列,便于后面计算
col_num=data.shape[1]      #训练特征个数
m=data.shape[0]            #训练标签个数
X=data.iloc[:,:col_num-1].values    #训练集的特征
y=data.iloc[:,col_num-1].values     #训练集的标签
y=y.reshape((m,1))                  

5.定义模型函数

定义h(X,w)函数用来计算模型预测值,这里采用的是线性模型

def h(X,w):
    return X@w

6.定义损失函数

定义cost(X,y,w)函数用来计算模型误差

def cost(X,y,w):
    return np.sum(np.power(h(X,w)-y,2))/(2*m)

7.求权重向量w

7.1 梯度下降函数

定义函数gradient_descent(X,y,w,n,a)用来执行梯度下降算法,更新权重向量w,并返回最终的权重向量和误差列表

def gradient_descent(X,y,w,n,a):
    t=w
    cost_lst=[]
    for i in range(n):
        error=h(X,w)-y
        for j in range(col_num-1):
            t[j][0]=w[j][0]-((a/m)*np.sum(error.ravel()*X[:,j].ravel()))
        w=t
        cost_lst.append(cost(X,y,w))
    return w,cost_lst

7.2 最小二乘法

定义函数least_square(X,y)用来执行最小二乘法,直接求出权重向量w,但是当n>10000时由于时间复杂度太大将导致程序运行超时

def least_square(X,y):
    w=np.linalg.inv(X.T@X)@X.T@y
    return w

8.训练模型

调用gradient_descent()函数训练模型,并输出误差随迭代次数变化的图像,用来观察模型的学习效果
其中,迭代次数越大,训练效果越好,学习率适中,既不可太大,也不可过小

n=10000    #迭代次数越多越好
a=0.003    #学习率适中,不能太大,也不能太小
w=np.zeros((col_num-1,1))  #初始化权重向量
w,cost_lst=gradient_descent(X,y,w,n,a)   #调用梯度下降函数
plt.plot(range(n),cost_lst,"r-+")
plt.xlabel("迭代次数")
plt.ylabel("误差")
plt.show()

9.绘制预测曲线

使用训练好的权重向量w绘制预测曲线,并将其与原始数据一起绘制在图像上,用来观察模型的预测效果

x=np.linspace(data["人口"].min(),data["人口"].max(),50)   #预测特征
y1=w[0,0]*1+w[1,0]*x      #预测标签
plt.scatter(data["人口"],data["收益"], label='训练数据')     #训练集
plt.plot(x,y1,"r-+",label="预测线")                         #预测集
plt.xlabel("人口",fontsize=10)
plt.ylabel("收益",fontsize=10)
plt.title("人口与收益之间的关系")
plt.show()

10.试试正则化

使用L2正则化(岭回归)防止过拟合

def gradient_descents(X,y,w,n,a,l):
    t=w
    cost_lst=[]
    for i in range(n):
        error=h(X,w)-y
        for j in range(col_num-1):
            t[j][0]=w[j][0]-((a/m)*(np.sum(error.ravel()*X[:,j].ravel())+2*l*w[j,0]))
        w=t
        cost_lst.append(cost(X,y,w))
    return w,cost_lst
n=10000    #迭代次数越多越好
a=0.003    #学习率适中,不能太大,也不能太小
l=1        
w=np.zeros((col_num-1,1))
w,cost_lst=gradient_descents(X,y,w,n,a,l)
plt.plot(range(n),cost_lst,"r-+")
plt.xlabel("迭代次数")
plt.ylabel("误差")
plt.show()

11.绘制预测曲线

使用训练好的权重向量w绘制预测曲线,并将其与原始数据一起绘制在图像上,用来观察模型的预测效果

x=np.linspace(data["人口"].min(),data["人口"].max(),50)
y1=w[0,0]*1+w[1,0]*x
plt.scatter(data["人口"],data["收益"], label='训练数据')
plt.plot(x,y1,"r-+",label="预测线")
plt.xlabel("人口",fontsize=10)
plt.ylabel("收益",fontsize=10)
plt.title("人口与收益之间的关系")
plt.show()

12.试试sklearn库

import pandas as pd  #导入pandas库
import numpy as np   #导入numpy库
import matplotlib.pyplot as plt   #导入matplotlib.pyplot库 
import sklearn       #导入sklearn库
from sklearn import linear_model
plt.rcParams['font.sans-serif']=['SimHei']   #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False    #用来正常显示负号
# 2.读取数据:使用pandas库的read_csv()函数读取数据文件。数据文件中包含了人口和收益两列数据。
data=pd.read_csv(r"d:线性回归/regress_data1.csv")   #读取数据    
data.insert(0,"ones",1)    #插入列
col_num=data.shape[1]      #列数
m=data.shape[0]            #行数
# 5.划分数据:将数据分为训练集和测试集,这里只使用了训练集。
X=data.iloc[:,:col_num-1].values    #训练集的特征
y=data.iloc[:,col_num-1].values     #训练集的标签
y.reshape((m,1))
mod=linear_model.LinearRegression()
mod.fit(X,y)
Y=mod.predict(X)
plt.scatter(X[:,1],y,marker='o',color='b')
plt.plot(X,Y,marker='+',color='r')
plt.xlabel("人口")
plt.ylabel("收益")
plt.show()

二、多变量线性回归

1.导入库

import pandas as pd  #导入pandas库
import numpy as np   #导入numpy库
import matplotlib.pyplot as plt   #导入matplotlib.pyplot库
plt.rcParams['font.sans-serif']=['SimHei']   #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False    #用来正常显示负号

2.读取数据

datas=pd.read_csv(r"d:/线性回归/regress_data2.csv")   #读取数据
datas=(datas-datas.mean())/datas.std()     #正则化

3.划分数据

datas.insert(0,'ones',1)          #插入列
col_num=datas.shape[1]            #训练特征个数
m=datas.shape[0]                  #训练标签
X=datas.iloc[:,:col_num-1].values  #训练特征
y=datas.iloc[:,col_num-1].values   #训练标签
y=y.reshape((m,1))                 

4.定义假设函数

def h(X,w):
    return X@w

5.定义损失函数

def cost(X,y,w):
    return np.sum(np.power(h(X,w)-y,2))/(2*m)

6.定义梯度下降函数

def gradient_descent(X,y,w,n,a):
    t=w
    cost_lst=[]
    for i in range(n):
        error=h(X,w)-y
        for j in range(col_num-1):
            t[j,0]=w[j,0]-((a/m)*np.sum(error.ravel()*X[:,j].ravel()))
        w=t
        cost_lst.append(cost(X,y,w))
    return w,cost_lst

7.训练模型

n=1000           #迭代次数
a=0.01           #学习率
w=np.zeros((col_num-1,1))     #初始化特征向量w
w,cost_lst=gradient_descent(X,y,w,n,a)
plt.plot(range(n),cost_lst,'r+-')
plt.xlabel("迭代次数")
plt.ylabel("误差")
plt.show()

8.运用sklearn绘图

import pandas as pd  
import numpy as np   
import matplotlib.pyplot as plt   
from sklearn import linear_model
from sklearn.preprocessing import PolynomialFeatures
plt.rcParams['font.sans-serif'] = ['SimHei']   
plt.rcParams['axes.unicode_minus'] = False    
# 读取数据
datas = pd.read_csv(r"d:线性回归/regress_data2.csv")
datas = (datas - datas.mean()) / datas.std()
X = datas.iloc[:, :-1].values
y = datas.iloc[:, -1].values.reshape(-1, 1)
# 多项式回归
poly = PolynomialFeatures(degree=2)
X_poly = poly.fit_transform(X)
mod = linear_model.LinearRegression()
mod.fit(X_poly, y)
# 绘制拟合曲线
x1 = np.linspace(datas["面积"].min(), datas["面积"].max(), 50)
x2 = np.linspace(datas["房间数"].min(), datas["房间数"].max(), 50)
x1, x2 = np.meshgrid(x1, x2)
X_grid = np.column_stack((x1.flatten(), x2.flatten()))
X_grid_poly = poly.fit_transform(X_grid)
y_pred = mod.predict(X_grid_poly)
fig=plt.figure()
ax = fig.add_subplot(projection='3d')
ax.scatter(X[:,0], X[:,1], y, marker='o', color='b')
ax.plot_surface(x1, x2, y_pred.reshape(x1.shape), cmap='coolwarm')
ax.set_title("价格随面积与房间数的变化曲面")
ax.set_xlabel("面积")
ax.set_ylabel("房间数")
ax.set_zlabel("价格")
plt.show()

总结

线性回归三大要素

  1. 假设函数 h(X,w)
  2. 损失函数 cost(X,y,w)
  3. 梯度下降/最小二乘函数(求解权重向量w的函数)

普通线性回归步骤

  1. 导入库
  2. 读取数据
  3. 划分数据
  4. 假设函数(模型函数)
  5. 损失函数
  6. 梯度下降/最小二乘
  7. 训练模型
  8. 绘图预测

调用sklearn库进行线性回归的步骤

  1. 导入库
  2. 读取数据
  3. 调用sklearn库
  4. 绘图

有关吴恩达机器学习--线性回归的更多相关文章

  1. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  2. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  3. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  4. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  5. ruby - 我的 Ruby IRC 机器人没有连接到 IRC 服务器。我究竟做错了什么? - 2

    require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame

  6. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  7. ruby - 我如何学习 ruby​​ 的正则表达式? - 2

    如何学习ruby​​的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby​​的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/

  8. 深度学习12. CNN经典网络 VGG16 - 2

    深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG

  9. 机器学习——时间序列ARIMA模型(四):自相关函数ACF和偏自相关函数PACF用于判断ARIMA模型中p、q参数取值 - 2

    文章目录1、自相关函数ACF2、偏自相关函数PACF3、ARIMA(p,d,q)的阶数判断4、代码实现1、引入所需依赖2、数据读取与处理3、一阶差分与绘图4、ACF5、PACF1、自相关函数ACF自相关函数反映了同一序列在不同时序的取值之间的相关性。公式:ACF(k)=ρk=Cov(yt,yt−k)Var(yt)ACF(k)=\rho_{k}=\frac{Cov(y_{t},y_{t-k})}{Var(y_{t})}ACF(k)=ρk​=Var(yt​)Cov(yt​,yt−k​)​其中分子用于求协方差矩阵,分母用于计算样本方差。求出的ACF值为[-1,1]。但对于一个平稳的AR模型,求出其滞

  10. 建模分析 | 平面2R机器人(二连杆)运动学与动力学建模(附Matlab仿真) - 2

    目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标

随机推荐