线性回归就是利用已知的数据样本,产生你和方程,从而对未知数据进行预测的过程,主要用于预测与判别合理性等方向

本章节我们主要讨论一元线性、多元线性、广义线性(也叫Logistic回归)等问题,下章节我们主要讨非线性回归、梯度下降等知识

关系概念

函数关系:确定性关系,y=a+bx

相关关系:非确定性关系

相关系数:

线性回归去除相关性 线性回归相关性检验_线性回归去除相关性


参数:截距a,斜率b误差项e

一元线性回归模型

若x与y之间存在着较强的相关性关系,我们有:Y≈a +bX+e,若a与b的值都已知,可以根据相应的X值预测出Y的预测值。

如何确定这几个参数呢?

我们知道,确定参数一定会有一个衡量标准的,这个衡量标准一般使用误差平方和,简单来说就是使用平方误差和衡量预测值h和真实值的差距,看一下示例图(盗用的别人的):

线性回归去除相关性 线性回归相关性检验_线性回归去除相关性_02


在上图的方程简单解释一下,中间的线就是拟合的线,就是基于数据点到回归线的距离之和,求其所有距离并求和,计算最小值的过程,在这个过程中我们可以使用误差距离的误差平方和进行衡量,就是求真实值与预测值平方的最小值:

线性回归去除相关性 线性回归相关性检验_数据集_03


从上式可以看出我们主要是使Rss值最小,然后求出公式里的α与β的值嘛,公式求一下偏导

线性回归去除相关性 线性回归相关性检验_数据集_04


把数据带进去就可以确定系数了,最简单的一元线性回归就求出来了

我们分别利用Python代码与R语言实现一下吧

from __future__ import print_function, division
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
#原始数据
x_data=np.array([20,22,19,25,18,27,30,15,33,38,22,40])
y_data=np.array([659,867,630,940,600,1000,1170,590,1280,1390,1080,1500])
# 学习率
learning_rate = 0.5
# 迭代次数
training_epochs = 1000
# 定义运算时的占位符
X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)
# 定义模型参数
W = tf.Variable(np.random.randn(), name="weight", dtype=tf.float32)
b = tf.Variable(np.random.randn(), name="bias", dtype=tf.float32)
# 定义模型
pred = tf.add(tf.multiply(W, X), b)
# 定义损失函数
cost = tf.reduce_min(tf.pow(pred-Y, 2)/(2*100))
# 使用Adam算法
optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost)
# 初始化所有变量
init = tf.global_variables_initializer()
# 训练开始
with tf.Session() as sess:
    sess.run(init)
    for epoch in range(training_epochs):
        for (x, y) in zip(x_data, y_data):
            sess.run(optimizer, feed_dict={X: x, Y: y})
        if (epoch + 1) % 50 == 0:#每50步输出一次结果
            c = sess.run(cost, feed_dict={X: x_data, Y: y_data})
            print("Epoch:", '%04d' % (epoch + 1), "cost=", "{:.3f}".format(c), "W=", sess.run(W), "b=", sess.run(b))
    print("Optimization Finished!")
    training_cost = sess.run(cost, feed_dict={X: x_data, Y: y_data})
    print("Training cost=", training_cost, "W=", sess.run(W), "b=", sess.run(b), '\n')

    # 使用matplot绘图
    plt.plot(x_data, y_data, 'ro', label="Original data")
    plt.plot(x_data, sess.run(W) * x_data + sess.run(b), label="Fitted line")
    plt.legend()
    plt.show()

R语言命令:创建数据:

h=c(184,172,158,165,168)
w=c(57,65,72,65,58)
#plot看看咋样
plot(w~h+1)
lines(h,a+b*h)
z=lm(w~h+1)
a
#线性模型的汇总数据,
summary(z)
# 方差分析函数anova()
anova(z)

多元线性回归

多元回归我们会使用矩阵来表示:

线性回归去除相关性 线性回归相关性检验_拟合_05


假设训练数据为:

线性回归去除相关性 线性回归相关性检验_线性回归_06


求和可以写成矩阵的形式:

线性回归去除相关性 线性回归相关性检验_线性回归去除相关性_07


多元和一元差不多,不同的是一元回归是线,而多元回归就是超平面了,例如二元回归就是平面,表达式就是形如:

线性回归去除相关性 线性回归相关性检验_拟合_08


线性回归去除相关性 线性回归相关性检验_线性回归_09


如果是三元以上的回归就是超平面了。他的误差损失函数和一元的定义很类似:

线性回归去除相关性 线性回归相关性检验_拟合_10


公式的推导这里就不详细介绍了,可以参考:这个大佬讲的特别细腻

#导入模块函数将数据集转化格式
from numpy import genfromtxt
import numpy as np   #导入模块numpy,中间需要用到矩阵的运算
from sklearn import datasets,linear_model  #导入数据集,并且导入线性回归模型函数


dataPath = r"E:\demo_py\python\machine_learning\MLR_1.csv"  #初始化数据集的文件路径
delivaryData = np.genfromtxt(dataPath,delimiter=',')  #将数据集文件中的数据转换为矩阵形式

print("data")
print(delivaryData)

X = delivaryData[:,:-1]  #提取数据集中所有行,并且除了倒数第一列以外的数据项
Y = delivaryData[:,-1]  #提取数据集中所有行,并且只有倒数第一列的数据项

print("特征矩阵")
print(X)
print("标记矩阵")
print(Y)

regr = linear_model.LinearRegression()  #创建线性回归模型对象

regr.fit(X,Y)  #将特征矩阵和标记矩阵传入模型器中训练模型

print("x的系数:",regr.coef_)   #输出模型的有关x的参数,b1,b2...
print("截距:",regr.intercept_)  #输出线性模型中的截距,b0

predict_x = [[102,6],]  #给出测试矩阵
predict_y = regr.predict(predict_x)  #预测
print("预测结果:",predict_y)

广义线性回归

所谓广义线性回归,我所理解的是Logistic回归,在前面的线性回归中,我们主要解决的是一个直线的拟,或者是一个平面、超平面的拟合,但是我们怎么解决这个曲面的拟合问题呢?对于曲面,我们既想使用线性函数进行拟合,又希望拟合过程尽可能好,那么,我们可以对上式进行变形:

线性回归去除相关性 线性回归相关性检验_数据集_11


直观一点的意思就是:

线性回归去除相关性 线性回归相关性检验_线性回归去除相关性_12


线性回归去除相关性 线性回归相关性检验_拟合_13


其中p表示Y=1的概率,以上内容参考了薛毅那本书来的,其实个人理解是这样的:

对于任意的x值,对应的y值都在区间(0,1)内:

线性回归去除相关性 线性回归相关性检验_线性回归_14


这个函数的曲线如下所示:

线性回归去除相关性 线性回归相关性检验_拟合_15


看个Python代码吧,这样好理解一点

from sklearn.linear_model import LogisticRegression
XTrain = [[0,0],[1,1]]
YTrain = [0,1]
reg = LogisticRegression()
reg.fit(XTrain, YTrain)
print(reg.score(XTrain,YTrain)