栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

标准方程法实现回归方程

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

标准方程法实现回归方程

标准方程法推导

对于标准方程法,我们得到其损失函数如下(因为损失函数为二次函数,所以图像上只有一个坑,不可能出现多个极小值):

将其展开为矩阵形式:

对矩阵进行求导:

梯度下降法和标准方程法的比较:

用python实现标准方程法

部分data.csv数据:

import numpy as np
from numpy import genfromtxt
import matplotlib.pyplot as plt

# 载入数据
data = np.genfromtxt("data.csv", delimiter=",")
# 去第0列为x_data,但是把x_data变成二维的
x_data = data[:,0,np.newaxis]
y_data = data[:,1,np.newaxis]

# 给样本添加偏置项,将x_data添加一列1
X_data = np.concatenate((np.ones((100,1)),x_data),axis=1)


# 重点:标准方程法求解回归参数
def weights(xArr, yArr):
    xMat = np.mat(xArr)
    yMat = np.mat(yArr)
    xTx = xMat.T*xMat # 矩阵乘法
    # 计算矩阵的值,如果值为0,说明该矩阵没有逆矩阵
    if np.linalg.det(xTx) == 0.0:
        print("This matrix cannot do inverse")
        return
    # xTx.I为xTx的逆矩阵
    ws = xTx.I*xMat.T*yMat
    return ws

# 调用标准方程法函数
ws = weights(X_data,y_data)

# 画图,取值从20取到80
x_test = np.array([[20],[80]])
y_test = ws[0] + x_test*ws[1]
plt.plot(x_data, y_data, 'b.')
plt.plot(x_test, y_test, 'r')
plt.show()


说明:sklearn中的线性回归就是标准方程法实现的

用sklearn实现一元线性回归
from sklearn.linear_model import LinearRegression
import numpy as np
import matplotlib.pyplot as plt

data=np.genfromtxt("D:gzu_ml资料程序回归data.csv",delimiter=",")

x_data=data[:,0,np.newaxis]
y_data=data[:,1,np.newaxis]
# 创建模型
model=LinearRegression()
# 训练模型
model.fit(x_data,y_data)

plt.plot(x_data,y_data,'b.')
plt.plot(x_data,model.predict(x_data),'r')
plt.show()

用sklearn实现二元线性回归
from sklearn import linear_model
import numpy as np
import matplotlib.pyplot as plt
from numpy import genfromtxt
import mpl_toolkits.mplot3d as Axes3D

data=np.genfromtxt("D:gzu_ml资料程序回归Delivery.csv",delimiter=",")
# 切分数据
# 将前面两列作为x_data
x_data=data[:,:-1]
# 最后一列作为y_data
y_data=data[:,-1]

# 创建模型
model=linear_model.LinearRegression()
# 训练模型
model.fit(x_data,y_data)


ax = plt.figure().add_subplot(111, projection = '3d')

ax.scatter(x_data[:,0], x_data[:,1], y_data, c = 'r', marker = 'o', s = 100) #绘制真实值  

x0 = x_data[:,0]
x1 = x_data[:,1]
# 生成网格矩阵
x0, x1 = np.meshgrid(x0, x1)
# intercept表示训练得到的截距,coef_表示训练得到的系数
z = model.intercept_+x0*model.coef_[0]+x1*model.coef_[1]
# 绘制二维平面
ax.plot_surface(x0, x1, z)
#设置坐标轴  
ax.set_xlabel('Miles')  
ax.set_ylabel('Num of Deliveries')  
ax.set_zlabel('Time')  
  
#显示图像  
plt.show()  

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/280558.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号