概述
机器学习就不多说了,回归分析呢是机器学习的算法里面比较简单的一个,那什么事回归分析呢?具体概念参照【百度百科】,我的理解,回归就是说任何事物的发展都会回归均值,比如抛硬币次数多了之后,概率总会回归到50%,一家人的升高总会回归到人类的平均身高这些。而回归分析就是通过分析影响最终结果的几个因素,通过大量数据分析出他们对最终结果的影响率是多少,最后得出一个回归模型,当把新的影响因素的值带进去后,能得到一个较准确的预测的值。
线性回归
回归分为线性回归和非线性回归,区分主要是通过公式画出来的图像,如果是一条直线,那就是线性回归,如果是曲线,那就是非线性回归。
线性回归公式
一元线性回归的公式:
h
w
(
x
)
=
w
0
+
w
1
x
1
h_w(x) = w_0+w_1x_1
hw(x)=w0+w1x1
多元线性回归公式:
h
w
(
x
)
=
2
0
+
w
1
x
1
+
w
2
x
2
.
.
.
+
w
m
x
m
h_w(x) = 2_0+w_1x_1+w_2x_2...+w_mx_m
hw(x)=20+w1x1+w2x2...+wmxm
代价函数
代价函数又叫损失函数,定义参照【百度百科】,我的理解就是,损失函数是我们通过公式得到的预测值与实际的真实值之间的误差,把所有的误差加起来求平均值,当这个平均值愈小的时候,我们预测值与真实值之间的误差就愈小,说明我们的预测越准确。
一元线性回归的代价函数公式:
J
(
w
0
,
w
1
)
=
Σ
i
=
1
m
(
y
i
−
h
w
(
x
i
)
)
2
/
2
m
J(w_0,w_1) = \Sigma_{i=1}^m(y^i-h_{w}(x^i))^2/2m
J(w0,w1)=Σi=1m(yi−hw(xi))2/2m
Σ
\Sigma
Σ表示累加
m 表示有多少个样本点
y
i
y^i
yi 表示真实值
h
w
(
x
i
)
h_w(x^i)
hw(xi) 表示带入上面线性回归公式得到的预测值。
梯度下降法
梯度下降法是机器学习中的一种算法,具体参照【百度百科】,我的理解是,假如在一个大坑里面,要走到坑的最低点,使用梯度下降法就跟盲人行走一样,一点一点往前面试,如果是低的,就往前走一步,如果是高的,就往回走一步,通过走了多次后,最终就会走到坑最低点附近。
梯度下降法公式:
θ
j
:
=
α
∗
α
/
α
θ
j
∗
J
(
θ
0
,
θ
1
)
\theta{j} := \alpha* \alpha /\alpha\theta_j*J(\theta_0,\theta_1)
θj:=α∗α/αθj∗J(θ0,θ1)
J
(
θ
0
,
θ
1
)
J(\theta_0, \theta_1)
J(θ0,θ1)表示代价函数 J =1或 J = 0
一元线性回归实例
有如下数据:data.csv
32.502345269453 | 31.7070058465699 |
---|---|
53.426804033275 | 68.7775959816389 |
61.5303580256364 | 62.5623822979458 |
47.475639634786 | 71.5466322335677 |
59.8132078695123 | 87.2309251336873 |
55.1421884139438 | 78.2115182707992 |
52.211796692214 | 79.6419730498087 |
39.299566694317 | 59.1714893218695 |
48.1050416917682 | 75.331242297063 |
52.5500144427338 | 71.3008798868503 |
左边一行是自变量,右边一行是因变量。下面我对它做回归分析,最后的结果就是得到一个模型,当传入一个自变量的时候,能预测到相对准确的因变量。(注:实际数据不只是这么一点,太多懒得打出来,格式大概是这样的就是了。)
import numpy as np
import matplotlib.pyplot as plt
# 加载数据
data = np.genfromtxt(r'data.csv', delimiter=',')
# 切分数据
x_data = data[:,0] # 自变量,所有行,第0列
y_data = data[:,1] # 因变量,所有行,第1列
# 学习率
lr = 0.0001
# 截距
b = 0
# 斜率
k = 0
# 迭代次数
times = 50
# 梯度下降法求导
def gradient_descent(x_data, y_data, lr, b, k, times):
m = float(len(x_data))
# 循环times次
for i in times:
b_grad = 0
k_grad = 0
# 计算梯度的总和再求平均值
for j in range(0, len(x_data)):
b_grad += ((b+k*x_data[j]) - y_data[j])
k_grad += ((b+k*x_data[j]) - y_data[j])*x_data[j]
# 更新b和k
b = b - (lr*b_grad/m)
k = k - (lr*k_grad/m)
return b,k
# 画图
b,k = gradient_descent(x_data,y_data,lr,b,k,times)
plt.plot(x_data,y_data, 'b.')
plt.plot(x_data, b+x_data*k,'r')
plt.show()
最终画出的图形就是这样,当我们带入一个x值时,观察他预测的结果与真实值。
# 预测值
h = b+k*x_data[3]
print(h,y_data[3])
# 结果
# 70.2420794647962 71.54663223356778
相对来说偏差还是有点大,说明我们的算法还不够准确,但总的来说,大概就是这么个方法。
这个是根据公式创建函数来实现算法,其实这些算法有很多机器学习的库里面都是封装好了的,直接用就可以了。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
# 加载数据
data = np.genfromtxt(r'data.csv', delimiter=',')
# 切分数据,注意使用第三方库的时候,需要把数据处理成指定格式
x_data = data[:,0, np.newaxis] # 自变量,所有行,第0列
y_data = data[:,1, np.newaxis] # 因变量,所有行,第1列
# 创建并拟合模型
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()
画出的图形是与上面的类似的,我们现在来测试一下这个模型的准确率
h = model.predict(x_data)[3]
print(h,y_data[3])
# 结果
# [70.77427966] [71.54663223]
比我们自己写的准确了好多。