理解机器学习中的线性回归及代码实现
机器学习的六大模型:
线性回归
逻辑回归
决策树
贝叶斯分类器
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}+....
(y1−b)2+(y2−b)2+(y3−b)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}
(2−4)2+(6−4)2+(9−4)2+(11−4)2+(4−4)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}
(y1−b)2+(y2−b)2+(y3−b)2+....+(yn−b)2 =
∑
i
=
1
n
(
y
i
−
b
)
2
\displaystyle \sum^{n}_{i=1 }{(y_i-b)^2}
i=1∑n(yi−b)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}
(y1−b1)2+(y2−b2)2+(y3−b3)2+....+(yn−bn)2 =
∑
i
=
1
n
(
y
i
−
b
i
)
2
\displaystyle \sum^{n}_{i=1 }{(y_i-b_i)^2}
i=1∑n(yi−bi)2
又由于
y
i
=
k
∗
x
i
+
b
y_i=k*x_i+b
yi=k∗xi+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}
(k∗x1+b−b1)2+(k∗x2+b−b2)2+....+(k∗xn+b−bn)2 =
∑
i
=
1
n
(
k
∗
x
i
+
b
−
b
i
)
2
\displaystyle \sum^{n}_{i=1 }{(k*x_i+b-b_i)^2}
i=1∑n(k∗xi+b−bi)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=1∑n(k∗xi+b−bi)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()
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
上一篇: 研究:机器学习可预测基因组修复结果
下一篇: PHP代码样式