本文索引:
- 线性回归原理
- 预测儿童身高实战
一、线性回归原理
【“回归”的由来】
- “回归”是由高尔顿(英国著名生物学家、统计学家,达尔文表弟)在研究人类遗传问题时提出来的。
- 为研究父代与子代身高的关系,高尔顿搜集了1078对父亲及其儿子的身高数据进行了深入分析,发现了回归效应:
- 当父亲高于平均身高时,他的儿子的身高比他矮的概率更大;父亲矮于平均身高时,他的儿子身高比他高的概率更大。
- 即这两种身高父亲的的儿子的身高,有向他们父辈的平均身高回归的趋势,解释为:大自然约束使人类身高分布相对稳定而非两极分化,就是所谓的“回归效应”。
【回归分析概念】
- 回归分析法:指将具有相关关系的两个变量之间的数量关系进行测定,通过建立一个数学表达式进行估计和预测的统计研究方法。如用大量具有相关关系的两个变量对数据建立的一个线性数学表达式:y=ax+b,其中a为斜率,b为截距,再有新的自变量x时,就可以用这个模型来预测y的值。
- 自变量:一般把作为估测依据的变量叫做自变量,x;
- 因变量:带估测的变量,y;
- 回归方程:反应自变量和因变量之间联系的数学表达式。
- 回归模型:某一类回归方程的总称。
【回归分析步骤】
- 1、测定相关关系的密切程度->2、建立回归方程->3、利用回归模型进行预测
【线性回归模型原理】
- 根据数学知识容易得知,对于平面上不重合的两个点P(,)和Q(,),可以唯一确定一条直线 = ,简单整理后得到,根据这个公式就可以准确计算任意x值在该直线上对应点的y值。
- 如果平面上有若干样本点,并且这些点不共线。现在要求找到一条最佳回归直线,使得这些点的总离差最小 ,确定最佳回归系数,满足下面的公式:
- 其中,X为包含若干x坐标的数组,为这些x坐标在回归直线上对应点的纵坐标,y为样本点的实际纵坐标。
- 确定了最佳回归直线的方程之后,就可以对为止样本进行预测了,也就是计算任意x值在该直线上对应点的y值。
二、预测儿童身高实战
【线性回归预测儿童身高】
- 假定一个人的身高只受年龄、性别、父母身高、祖父母身高和外祖父母身高这几个因素的影响,并假定大致符合线性关系。
- 在其他条件不变的情况下,随着年龄的增长,会越来越高;
- 同样,对于其他条件都相同的儿童,其父母身高较高的话,儿童也会略高一些。
- 假定到18岁后身高会长期保持固定而不再变化(不考虑年龄太大之后会稍微转变矮一点的情况)。
- 根据给定训练数据和对应标签,线型标签拟合出儿童身高模型,预测测试儿童身高。
- 训练数据:每行表示一个样本,包含信息为:儿童年龄,性别(0女1男)、父亲、母亲、祖父、祖母、外祖父和外祖母的身高。
[[1,0,180,165,175,165,170,165],
[3,0,180,165,175,165,173,165],
[4,0,180,165,175,165,170,165],
[6,0,180,165,175,165,170,165],
[8,1,180,165,175,167,170,165],
[10,0,180,166,175,165,170,165],
[11,0,180,165,175,165,170,165],
[12,0,180,165,175,165,170,165],
[13,1,180,165,175,165,170,165],
[14,0,180,165,175,165,170,165],
[17,0,170,165,175,165,170,165]]
- 对应标签数据:儿童身高
[60,90,100,110,130,140,150,164,160,163,168]
- 待测数据
[[10,0,180,165,175,165,170,165],[17,1,173,153,175,161,170,161],[34,0,170,165,170,165,170,165]]
好的我们来看完整实操:
【问题分析与步骤】
- 导入扩展库
import numpy as np
from sklearn import linear_model
import copy
- 准备训练数据
# x为训练数据
x = np.array([[1,0,180,165,175,165,170,165], [3,0,180,165,175,165,173,165], [4,0,180,165,175,165,170,165], [6,0,180,165,175,165,170,165], [8,1,180,165,175,167,170,165], [10,0,180,166,175,165,170,165], [11,0,180,165,175,165,170,165], [12,0,180,165,175,165,170,165], [13,1,180,165,175,165,170,165], [14,0,180,165,175,165,170,165], [17,0,170,165,175,165,170,165]])
# y为对应标签
y = np.array([60,90,100,110,130,140,150,164,160,163,168])
- 创建线性回归模型
lr = linear_model.LinearRegression()
- 训练模型
xs = np.array([[10,0,180,165,175,165,170,165],[17,1,173,153,175,161,170,161],[34,0,170,165,170,165,170,165]])
- 预测数据并打印结果:
for item in xs:
item1 = copy.deepcopy(item)
if item1[0] > 18:
item1[0] = 18
print(item,':',lr.predict(item1.reshape(1,-1)))
运行结果:
[ 10 0 180 165 175 165 170 165] : [140.56153846]
[ 17 1 173 153 175 161 170 161] : [158.41]
[ 34 0 170 165 170 165 170 165] : [176.03076923]
这部分可能有点迷,我把我的ipynb网页文件笔记放在这供验证查看,算了,下载文件不方便,放两张图:
关于一些jupyter notebook的使用技巧,我会专门写一篇关于格式技巧方面的文章,可以查看少踩一些坑。