欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

理解机器学习中的线性回归及代码实现

程序员文章站 2022-03-05 09:34:35
机器学习的六大模型:线性回归逻辑回归决策树贝叶斯分类器SVM集成学习1、线性回归1.1什么是线性回归? 我们先做一道题如下图x357813y3578?求x=13时,y的值为多少?这里,很容易想到方程原方程y=x 然后解得y=13这就是线性回归。但是,实际问题中,x,y的分布,可能是这样的x357813y26911?设此时的方程为y=kx+b随机令 k=0 ,b=4计算所有点与该直线的...

机器学习的六大模型:
线性回归
逻辑回归
决策树
贝叶斯分类器
SVM
集成学习

1、线性回归

1.1什么是线性回归? 我们先做一道题

如下图

x 3 5 7 8 13
y 3 5 7 8 ?

求x=13时,y的值为多少?

这里,很容易想到方程原方程y=x 然后解得y=13
这就是线性回归。

但是,实际问题中,x,y的分布,可能是这样的

x 3 5 7 8 13
y 2 6 9 11 ?

设此时的方程为y=kx+b
随机令 k=0 ,b=4
计算所有点与该直线的距离 : ( y 1 − b ) 2 + ( y 2 − b ) 2 + ( y 3 − b ) 2 + . . . . \sqrt{(y_1-b)^2}+\sqrt{(y_2-b)^2}+\sqrt{(y_3-b)^2}+.... (y1b)2 +(y2b)2 +(y3b)2 +....
= ( 2 − 4 ) 2 + ( 6 − 4 ) 2 + ( 9 − 4 ) 2 + ( 11 − 4 ) 2 + ( 4 − 4 ) 2 \sqrt{(2-4)^2}+\sqrt{(6-4)^2}+\sqrt{(9-4)^2}+\sqrt{(11-4)^2}+\sqrt{(4-4)^2} (24)2 +(64)2 +(94)2 +(114)2 +(44)2
=82

我们以这个值的大小作为判断该曲线是否拟合的好
不过,科学家用 残差平方和(RSS) 来衡量:

RSS= ( y 1 − b ) 2 + ( y 2 − b ) 2 + ( y 3 − b ) 2 + . . . . + ( y n − b ) 2 {(y_1-b)^2}+{(y_2-b)^2}+{(y_3-b)^2}+....+{(y_n-b)^2} (y1b)2+(y2b)2+(y3b)2+....+(ynb)2 = ∑ i = 1 n ( y i − b ) 2 \displaystyle \sum^{n}_{i=1 }{(y_i-b)^2} i=1n(yib)2
RSS的值越小,表明该函数与原数据拟合的越好。

这里我们对RSS稍做修改,在方程y=kx+b 中,因为 只要 k 不为 0 ,b就会改变,所以:
RSS= ( y 1 − b 1 ) 2 + ( y 2 − b 2 ) 2 + ( y 3 − b 3 ) 2 + . . . . + ( y n − b n ) 2 {(y_1-b_1)^2}+{(y_2-b_2)^2}+{(y_3-b_3)^2}+....+{(y_n-b_n)^2} (y1b1)2+(y2b2)2+(y3b3)2+....+(ynbn)2 = ∑ i = 1 n ( y i − b i ) 2 \displaystyle \sum^{n}_{i=1 }{(y_i-b_i)^2} i=1n(yibi)2
又由于 y i = k ∗ x i + b y_i=k*x_i+b yi=kxi+b

RSS= ( k ∗ x 1 + b − b 1 ) 2 + ( k ∗ x 2 + b − b 2 ) 2 + . . . . + ( k ∗ x n + b − b n ) 2 {(k*x_1+b-b_1)^2}+{(k*x_2+b-b_2)^2}+....+{(k*x_n+b-b_n)^2} (kx1+bb1)2+(kx2+bb2)2+....+(kxn+bbn)2 = ∑ i = 1 n ( k ∗ x i + b − b i ) 2 \displaystyle \sum^{n}_{i=1 }{(k*x_i+b-b_i)^2} i=1n(kxi+bbi)2
现在要求RSS的最小值,我们只要算得RSS方程中导数为0的点即可
f ( k , b ) = ∑ i = 1 n ( k ∗ x i + b − b i ) 2 f(k,b)=\displaystyle \sum^{n}_{i=1 }{(k*x_i+b-b_i)^2} f(k,b)=i=1n(kxi+bbi)2
只要求出导数最为0的点就可求出k,b
这里数学家经过一系列复杂运算求得 k = ( x T x ) X T Y (x^Tx)X^TY (xTx)XTY (正规方程)

1.2 用正规方程实现线性回归

import numpy as np
from sklearn.model_selection import train_test_split
from numpy.linalg import inv

date = np.loadtxt("./date/aqi.csv", delimiter=",", skiprows=1, dtype=np.float32) 
 # delimiter:   以逗号分开                dtype:加载时的数据类型
 # skiprows:删除第一条数据(标题)
index = np.ones((date.shape[0], 1)) # 生成一列全部为1的数据  (正规方程需要多一列的数据)
date = np.hstack((date, index))     # 插入一列
x = date[:, 1:]                     # 截取行(第0行到最后一行),列(第1行到最后一列)
y = date[:, 0]                      # 截取行(第0行到最后一行),列(第0列)
# print(x)

# 将数据分隔为训练集和验证集
train_x, test_x, train_y, test_y = train_test_split(x, y, train_size = 0.7)
 # 百分之80的数据为训练集,20为验证集
theta = np.dot(np.dot(inv(np.dot(train_x.T, train_x)), train_x.T), train_y)   # 正规方程
# np.dot()矩阵相乘    inv() 求逆    .T 转置 
predict = np.dot(test_x, theta)
print(test_x[:, 0])
print(predict)

import matplotlib.pyplot as plt		# 对预测结果与实际结果进行显示,比较
plt.plot(range(len(test_y)), test_y, c="red", alpha=0.5)
plt.plot(range(len(test_y)), predict, c="blue", alpha=0.5)
plt.show()

aqi.csv数据文件

1.3 用sklearn实现线性回归

1.3.1 sklearn中有自带实现线性回归的库

from sklearn.model_selection import train_test_split
from sklearn import linear_model #线性模型
import numpy as np
date = np.loadtxt("./date/aqi.csv", delimiter=",", skiprows=1, dtype=np.float32)  # delimiter:以,分开 dtype:加载时的数据类型
x = date[:, 1:]
y = date[:, 0]
train_x, test_x, train_y, test_y = train_test_split(x, y, train_size=0.7)
model = linear_model.LinearRegression()     # 线性回归模型对象
model.fit(train_x, train_y)
print(model.coef_) # 系数 (权重)
print(model.intercept_) # 截距 (偏置)

y_predict = model.predict(test_x)

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ["SimHei"] # 支持中文
plt.title("预测")
plt.xlabel("x 轴")
plt.ylabel("y 轴")
plt.scatter(test_x, test_y, c="r")     # 画点
plt.plot(test_x, y_predict, c="blue")  # 画直线
plt.show()

1.3.2 模型的保存 与 调用

如何把训练好的模型保存下来?

from sklearn.model_selection import train_test_split
from sklearn import linear_model #线性模型
import numpy as np
import pickle
date = np.loadtxt("./date/aqi.csv", delimiter=",", skiprows=1, dtype=np.float32)  # delimiter:以,分开 dtype:加载时的数据类型
x = date[:, 1:]
y = date[:, 0]
train_x, test_x, train_y, test_y = train_test_split(x, y, train_size=0.7)
model = linear_model.LinearRegression()     # 线性回归模型对象
model.fit(train_x, train_y)

with open("model.pickle", "wb") as f:  # 模型的保存
    pickle.dump(model, f)

调用自己训练好的模型

import pickle

with open("model.pickle", "rb") as f:
    model = pickle.load(f)
test = [[23]]
y_predict = model.predict(test)
print(y_predict)

本文地址:https://blog.csdn.net/weixin_41472455/article/details/109614781