目录
回归分析
用来建立方程模拟两个或者多个变量之间如何关联
被预测的变量叫做:因变量,输出
被用来进行预测的变量叫做:自变量,输入
一元线性回归包含一个自变量一个因变量
两个变量的关系用一条直线来模拟
如果包含两个以上的自变量,则称作多元回归分析
hθ(x) = θ0 + θ1x 这条直线称为回归线 θ1为回归线斜率 θ0为回归线截距
代价函数 (损失函数)
方法:最小二乘法
真实值 y 预测值hθ(x) 则误差平法为(y - hθ(x))^2
找到合适的参数,使误差平方和:最小。
梯度下降法 ---一元线性回归
用代码来模拟一元线性回归:
首先先把需要用到的库导入
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
然后载入data.scv,这是一个描述很多点坐标的一个文件,显示出点的分布
# 载入数据
data = np.genfromtxt("data.csv",delimiter=",")
x_data = data[:,0]
y_data = data[:,1]
plt.scatter(x_data,y_data)
plt.show()
接下来实现最小二乘法函数以及梯度下降法的函数,更新回归线的斜率以及截距,使误差更小
#学习率
lr = 0.0001
#截距
b = 0
#斜率
k = 0
#最大迭代次数
epochs = 50
#最小二乘法
def minimum_squares(x_data,y_data,b,k):
totalError = 0
for i in range(0,len(x_data)):
totalError += (y_data[i] - (k*x_data[i] + b)) ** 2
return totalError / float(len(data)) / 2.0
def gradient_descent_runner(x_data,y_data,b,k,lr,epochs):
#计算总数据量
m = float(len(x_data))
#循环epochs次
for i in range (epochs):
b_grad = 0
k_grad = 0
#计算梯度的总和再求平均
for j in range(0,len(x_data)):
b_grad += (1/m) *(((k*x_data[j]) +b) - y_data[j])
k_grad += (1/m) *(((k*x_data[j]) +b) - y_data[j]) * x_data[j]
#更新b和k
b = b - (lr * b_grad)
k = k - (lr * k_grad)
#每迭代5次,输出一次图像
if i % 5 == 0:
print("epochs:",i)
plt.plot(x_data,y_data,'b.')
plt.plot(x_data,k*x_data+b,'r')
plt.show()
return b,k
print("Staring b ={0},k = {1}, error = {2}" .format(b,k,minimum_squares(x_data,y_data,b,k)))
print("Running.....")
b,k = gradient_descent_runner(x_data,y_data,b,k,lr,epochs)
print("After {0} iterations b = {1},k={2},error = {3}" .format(epochs,b,k,minimum_squares(x_data,y_data,b,k)))
#画图
plt.plot(x_data,y_data,'b.')
plt.plot(x_data,k*x_data+b, 'r')
plt.show()
代码中使用了迭代50次,每5次输出一次图像 结果如下:
从上图中我们可以很清楚的看到了,红色线段的误差越来越小。
sklearn ---一元线性回归
其实,我们要实现一元线性回归,我们可以直接调用库来完成,但是由于我们使初学者,对于实现的过程以及思想还是弄清楚最好,对于有些比较麻烦的思想,我们可以直接调用来实现。
实现代码如下:
先导入需要的库
from sklearn.linear_model import LinearRegression
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
再载入数据
#载入数据
data = np.genfromtxt("data.csv",delimiter = ',')
x_data = data[:,0]
y_data = data[:,1]
plt.scatter(x_data,y_data) #scatter 画三散点图
plt.show()
print(x_data.shape) #shape 查看矩阵或者数组的维数
如图:
x_data = data[:,0,np.newaxis]
y_data = data[:,1,np.newaxis]
model = LinearRegression()
model.fit(x_data,y_data)
上边代码的处理过程只是因为我们fit函数使用时,它的参数有要求,对于这个问题,我们可以自己搜fit函数的使用方法。
plt.plot(x_data,y_data,'b.')
plt.plot(x_data,model.predict(x_data),'r')
plt.show()
上边代码就是我们实现一元线性回归调用的函数,结果如图:
这个图最终的结果和我们自己编写出来代码实现的结果是一样的。