机器学习(五)-保险保费的多元线性回归模型案例

项目描述保险公司对个人投保时或根据历史数据生成的模型来计算个人保费,那么本次我们就以这个模型的求解过程为例来实践下多元线性回归。2 数据与简单分析数据集下载数据信息如下图所示:我们已经获取到保险公司部分数据,文件名为insurance.csv,文件内容如下。我们可以看出数据中共有六个维度:age(年龄),sex(性别),bmi(肥胖指数),children(孩子数量),smoker(是否吸烟),region(居住地)。charges则是当前数据人上年度在保险的额度。所以我们可以构建一个六维高维空间来求解这个模型。相对于年龄来说, 年龄越大, 购买保险的金额应该越大;相对于性别来说,整体女性的寿命大于男性寿命大约10年, 因此男性的保险额度应该更大。相对于肥胖指数来说, 肥胖指数越小, 身体状况越不好, 购买保险的金额应该越大;相对于孩子的数量来说, 孩子的数量越多, 压力越大, 越劳累, 购买保险的金额应该越大;相对于是否吸烟来说, 吸烟的人寿命远少于不吸烟的寿命, 因此 购买保险的金额应该越大;相对于地区来说, 地区环境越差, 有雾霾, 则越容易生病, 那么购买保险的金额应该越大;最后说明一下,本章中的数据来源主要是来自某保险公司内部的真实历史数据。3 项目实践完成本项目后,您将知道:如何从训练数据中估计统计量。如何从数据估计线性回归系数。如何使用线性回归预测新数据。import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom sklearn.preprocessing import PolynomialFeaturesfrom sklearn.linear_model import LinearRegression# 1). 读取csv文件数据;filename = ‘data/insurance.csv’data = pd.read_csv(filename)# 2). 清洗数据reg = LinearRegression()x = data[[‘age’, ‘sex’, ‘bmi’, ‘children’, ‘smoker’, ‘region’]]y = data[‘charges’]# 转换数据类型为整形x = x.apply(pd.to_numeric, errors=‘corece’)y = y.apply(pd.to_numeric, errors=‘coerce’)# 填充空值x.fillna(0, inplace=True)y.fillna(0, inplace=True)print(x)print(y)# 3). 开始建模# degree: 多项式的阶数,一般默认是2;# interaction_only:如果值为true(默认是false),则会产生相互影响的特征集。# include_bias:是否包含偏差列poly_features = PolynomialFeatures(degree=2, include_bias=False)# 降维X_poly = poly_features.fit_transform(x)# 4). 用线性回归进行拟合reg.fit(X_poly, y)print(reg.coef_)print(reg.intercept_)# 5). 预测y_predict = reg.predict(X_poly)# 5). 真实的y值绘制:图形绘制显示plt.plot(x[‘age’], y, ‘b.’)# 预测的y值绘制plt.plot(X_poly[:, 0], y_predict, ‘r.’)plt.show()预测值与真实值的图像显示:

April 17, 2019 · 1 min · jiezi

机器学习(三)-单变量线性回归算法

@toc1 预测数值型数据:回归1.1 什么是回归?大自然让我们回归到一定的区间范围之内;反过来说就是,有一个平均的水平,可以让突出的事物能向他靠拢。回归是由达尔文(Charles Darwin)的表兄弟Francis Galton发明的。 Galton于1877年完成了第一次回归预测,目的是根据上一代豌豆种子(双亲)的尺寸来预测下一代豌豆种子(孩子)的尺寸。Galton在大量对象上应用了回归分析,甚至包括人的身高。他注意到,如果双亲的高度比平均高度高,他们的子女也倾向于比平均高度高,但尚不及双亲。孩子的高度向着平均高度回退(回归)。Galton在多项研究上都注意到这个现象,所以尽管这个英文单词跟数值预测没有任何关系,但这种研究方法仍被称作回归 2 。那些高个子的后代的身高,有种回归到大众身高的趋势。 eg: 姚明身高2米26,叶莉身高1米90, 但是他们后代的身高是会逐渐回归到正常的身高水平。1.2 回归的目的是预测数值型的目标值。1.3 回归可以做什么事?回归可以做任何事情。然而大多数公司常常使用回归法做一些比较沉闷的事情,例如:销售量预测制造缺陷预测。当然也可以做有新意的应用,例如:预测名人的离婚率。预测所在地区的房价。2 线性回归模型表示2.1 线性回归的基本概念回归,一般都是指线性回归(linear regression).从我们最熟悉的开始, 已知两点,求直线公式设 y = ax+b, 带入两点,求得解析解为 y = 3x-60回归方程 (regression equation): y = 3x-60回归系数 (regression weights): 3和-60可以称为回归系数回归: 求这些回归系数的过程2.2 西安高新区房价预测这个例子是预测住房价格的,我们要使用一个数据集,数据集包含西安市的住房价格。在这里,我要根据不同房屋尺寸所售出的价格,画出我的数据集。比方说,如果你朋友的房子是40平方米大小,你要告诉他们这房子能卖多少钱。那么,你可以做的一件事就是构建一个模型,也许是条直线,从这个数据模型上来看,也许你可以告诉你的朋友,他能以大约78万(人民币)左右的价格卖掉这个房子。这就是监督学习算法的一个例子。 m:表示训练集数据的总量 x:表示输入变量 y:表示输出变量 (x,y): 表示一个训练样本 (x(i),y(i)): 表示第i个训练样本3 回归的一般方法3.1 线性回归的一般步骤对于一元线性回归(单变量线性回归)来说,学习算法为 y = ax + b 我们换一种写法: h(x) = 0 + 1x13.2 利用Sklearn做线性回归的预测实现步骤1). 模拟数据2). 调用sklearn拟合数据, 把theta0 theta1求出来3). 预测from sklearn.linear_model import LinearRegressionimport numpy as np# 1).模拟数据X = np.random.rand(100, 1)Y = 4 + 2 * X + np.random.randn(100, 1)# 2). 调用sklearn拟合数据, 把theta0 theta1求出来# 导入线性回归类lin_reg = LinearRegression()# 让线性回归类做训练lin_reg.fit(X, Y)# 输出theta0 theta1; intercept_是截距, coef_是斜率系数;print("\ntheat0, theta1:", lin_reg.intercept_, lin_reg.coef_)# 3). 预测X_new = np.array([[0], [1]])print("\nx=0, x=1预测结果:\n", lin_reg.predict(X_new))测试结果:3 损失/代价函数3.1 拟合线性回归实际上要做的事情就是: 选择合适的参数(0, 1),使得h(x)方程,很好的拟合训练集。实现如何把最有可能的直线与我们的数据相拟合。拟合就是把平面上一系列的点,用一条光滑的曲线连接起来。因为这条曲线有无数种可能,从而有各种拟合方法。拟合的曲线一般可以用函数表示.下面的三张图, 展示了拟合的三种状态:图一是部分拟合图二是完全不拟合图三是完全拟合3.2 损失函数: 均方误差MSE拟合过程中因为theta0和theta1的取值准确度, 预测的结果与训练集中的实际值有差距。我们选择的参数决定了我们得到的直线相对于我们的训练集的准确程度,模型所预测的值与训练集中实际值之间的差距(下图中蓝线所指)就是建模误差(modeling error)。我们的目标便是选择出可以使得建模误差的平方和能够最小的模型参数。 即使得损函数最小。3.3 均方误差MSE最小化二维空间求均方差上图是参考吴恩达视频的图片, 我们会发现随着theta1的不断变化, 均方误差MSE会找到一个最小值。 如果从数学角度来看, 就是求解函数的导数,计算函数的最小值。三维空间求均方差上图是参考吴恩达视频的图片, 我们会发现随着theta0和theta1的不断变化, 均方误差MSE会找到一个最小值。为了通过图形化看到最小的均方差, 三维图片并不直观。 通常使用等高线实现。如下图:更高维空间我们会遇到更复杂、更高维度、更多参数的情况,而这些情况是很难画出图的,因此更无法将其可视化,因此我们真正需要的是编写程序来找出这些最小化代价函数的和的值,而梯度下降算法就是能够自动地找出能使代价函数最小化的参数和的值。4 梯度下降4.1 梯度下降的思想梯度下降是一个用来求函数最小值的算法,我们将使用梯度下降算法来求出代价函数的最小值。梯度下降背后的思想是:开始时我们随机选择一个参数的组合,计算代价函数,然后我们寻找下一个能让代价函数值下降最多的参数组合。我们持续这么做直到到到一个局部最小值(local minimum),因为我们并没有尝试完所有的参数组合,所以不能确定我们得到的局部最小值是否便是全局最小值(global minimum),选择不同的初始参数组合,可能会找到不同的局部最小值。4.2 梯度下降的分类想象一下你正站立在山的这一点上,站立在你想象的公园这座红色山上,在梯度下降算法中,我们要做的就是旋转360度,看看我们的周围,并问自己要在某个方向上,用小碎步尽快下山。这些小碎步需要朝什么方向?如果我们站在山坡上的这一点,你看一下周围,你会发现最佳的下山方向,你再看看周围,然后再一次想想,我应该从什么方向迈着小碎步下山?然后你按照自己的判断又迈出一步,重复上面的步骤,从这个新的点,你环顾四周,并决定从什么方向将会最快下山,然后又迈进了一小步,并依此类推,直到你接近局部最低点的位置。公式:理解a是学习率(learning rate),它决定了我们沿着能让代价函数下降程度最大的方向向下迈出的步子有多大;如果太小的话,梯度下降会很慢如果太大的话,梯度下降越过最小值,不仅不会收敛,而且有可能发散不论斜率正或负,梯度下降都会逐渐趋向最小值即使学习率是固定不变的,梯度下降也会收敛到一个最低点梯度下降的两种更新方式:4.2.1 “Batch” Gradient Descent 批梯度下降批梯度下降:指的是每下降一步,使用所有的训练集来计算梯度值在梯度下降中,在计算微分求导项时,我们需要进行求和运算,所以,在每一个单独的梯度下降中,我们最终都要计算这样一个东西,这个项需要对所有个训练样本求和。因此,批量梯度下降法这个名字说明了我们需要考虑所有这一"批"训练样本,代码实现"““线性回归实现梯度下降的批处理(batch_gradient_descent )“““import numpy as npX = 2 * np.random.rand(100, 1)y = 4 + 3 * X + np.random.randn(100, 1)X_b = np.c_[np.ones((100, 1)), X]# print(X_b)learning_rate = 0.1# 通常在做机器学习的时候,一般不会等到他收敛,因为太浪费时间,所以会设置一个收敛次数n_iterations = 100000m = 100# 1.初始化theta, w0…wntheta = np.random.randn(2, 1)count = 0# 4. 不会设置阈值,之间设置超参数,迭代次数,迭代次数到了,我们就认为收敛了for iteration in range(n_iterations): count += 1 # 2. 接着求梯度gradient gradients = 1/m * X_b.T.dot(X_b.dot(theta)-y) # 3. 应用公式调整theta值, theta_t + 1 = theta_t - grad * learning_rate theta = theta - learning_rate * gradientsprint(count)print(theta)执行结果4.2.2 “Stochastic” Gradient Descent 随机梯度下降随机梯度下降:指的是每下降一步,使用一条训练集来计算梯度值4.2.3 “Mini-Batch” Gradient Descent “Mini-Batch”梯度下降“Mini-Batch”梯度下降:指的是每下降一步,使用一部分的训练集来计算梯度值 ...

April 17, 2019 · 1 min · jiezi

机器学习(四)-多变量线性回归

1 多变量线性回归应用场景目前为止,我们探讨了单变量/特征的回归模型,现在我们对房价模型增加更多的特征,例如房间数楼层等,构成一个含有多个变量的模型.。1.1 单变量线性回归案例模型: h(x) = 0 + 1x1.2 多变量线性回归案例模型:新的概念例如: x(1) = [40, 1, 1, 10] x(2) = [96, 2, 1, 5] x(3) = [135, 3, 2, 20]例如:x(1)1 = 40x(1)2 = 1…….2 多元梯度下降法模型:参数:损失函数:梯度下降公式(重复执行):2.1 一元梯度下降n=1, 重复执行,直到收敛2.2 多元梯度下降n>12.3 多元批梯度下降代码import numpy as np# 1). 模拟数据X1 = 2 * np.random.randn(100, 1)X2 = 4 * np.random.rand(100, 1)X3 = 6 * np.random.rand(100, 1)y = 4 + 3 * X1 + 4 * X2 + 5 * X3 + np.random.randn(100, 1)# 2). 实现梯度下降算法# np.c_是将数据组合成向量格式: (n, 1) (n,1) = (n, 2)X_b = np.c_[np.ones((100, 1)), X1, X2, X3]# 初始化theta的值, 需要计算四个theta的值;theta = np.random.randn(4, 1)# 设置学习率和收敛次数learning_rate = 0.1n_iterations = 1000# 根据公式计算for iteration in range(n_iterations): # 梯度下降公式 = 1/样本数 * (预测值 - 真实值) Xi gradients = 1 / 100 * X_b.T.dot(X_b.dot(theta) - y) # theta = theta - 学习率 * 梯度值 theta = theta - learning_rate * gradientsprint(theta)代码执行结果:3 梯度下降法实践一:特征缩放3.1 梯度下降法遇到的问题在我们面对多维特征问题的时候,我们要保证这些特征都具有相近的尺度,这将帮助梯度下降算法更快地收敛。而特征缩放是为了确保特征在一个数量级上。 以房价问题为例,假设我们使用两个特征,房屋的尺寸和房间的数量,其中x1 = 房屋面积(0-400 m2), x2 = 卧室数量(1-5), 以两个参数分别为横纵坐标,绘制代价函数的等高线图能,看出图像会显得很扁,梯度下降算法需要非常多次的迭代才能收敛。3.2 解决方法解决方法一:尝试将所有特征的尺度都尽量缩放到-1到1之间。比如:x1 = 房屋面积 / 400x2 = 卧室数量 / 5解决方法二: 平方均值法在原来的基础上把特征 xi 替换成 xi – ;也可以把最大值换成标准差,或者最大值 – 最小值。4 梯度下降法实践二: 学习率4.1 梯度下降法遇到的问题梯度下降算法收敛所需要的迭代次数根据模型的不同而不同,我们不能提前预知,我们可以绘制迭代次数和代价函数的图表来观测算法在何时趋于收敛。梯度下降算法的每次迭代受到学习率的影响,如果学习率过小,则达到收敛所需的迭代次数会非常高;如果学习率过大,每次迭代可能不会减小代价函数,可能会越过局部最小值导致无法收敛。4.2 解决方法自动测试是否收敛的方法,例如将代价函数的变化值与某个阀值(例如0.001)进行比较,但通常看上面这样的图表更好。尝试在如下的数值中选择 : …, 0.001, 0.003, 0.01, 0.03, 0.1, 0.3, 1,…5 梯度下降算法补充5.1 三种梯度下降总结如何选择?训练集比较小: 使用批梯度下降(小于2000个)训练集比较大:使用Mini-bitch梯度下降 一般的Mini-batch size 是64,128,256, 512,1024, Mini-batch size要适用CPU/GPU的内存5.2 随机梯度下降随机梯度下降思想:把m个样本分成m份,每次用1份做梯度下降;也就是说,当有m个样本时,批梯度下降只能做一次梯度下降,但是随机梯度下降可以做m次。实现代码import numpy as npimport randomX = 2 * np.random.rand(100, 1)Y = 4 + 3 * X + np.random.randn(100, 1)X_b = np.c_[np.ones((100, 1)), X]# 每轮epochs处理m个样本;n_epochs = 1000# 学习率a0 = 0.1# 定义衰减率decay_rate = 1def learning_schedule(epoch_num): """ 定义一个学习率衰减的函数 """ return (1.0 / (decay_rate * epoch_num + 1)) * a0# 初始化theta值theta = np.random.randn(2, 1)# 初始化随机值num = [i for i in range(100)]m = 100for epoch in range(n_epochs): rand = random.sample(num, 100) for i in range(m): random_index = rand[i] xi = X_b[random_index:random_index + 1] yi = Y[random_index:random_index + 1] # 随机梯度下降值 gradients = xi.T.dot(xi.dot(theta) - yi) # 学习率 learning_rate = learning_schedule(epoch+1) theta = theta - learning_rate * gradientsprint(theta)执行结果展示:5.3 Mini-batch梯度算法随机梯度下降会丧失向量带来的加速,所以我们不会太用随机梯度下降。实现代码import numpy as npimport randomX = 2 * np.random.rand(100, 1)y = 4 + 3 * X + np.random.randn(100, 1)X_b = np.c_[np.ones((100, 1)), X]# print(X_b)n_epochs = 500a = 0.03m = 100num = [i for i in range(100)]theta = np.random.randn(2, 1)batch_num = 5batch_size = m // 5# epoch 是轮次的意思,意思是用m个样本做一轮迭代for epoch in range(n_epochs): # 生成100个不重复的随机数 for i in range(batch_num): start = ibatch_size end = (i+1)batch_size xi = X_b[start:end] yi = y[start:end] gradients = 1/batch_size * xi.T.dot(xi.dot(theta)-yi) print(a) learning_rate = a theta = theta - learning_rate * gradientsprint(theta)执行结果展示:5.4 Mini-batch梯度算法优化: 学习率衰减在做Mini-batch的时候,因为噪声的原因,可能训练结果不是收敛的,而是在最低点周围晃动,如果我们要解决这个问题,那我们就需要减少学习率,让他在尽量小的范围内晃动1 epoch = 1 次遍历所有的数据学习率衰减公式:实现代码import numpy as npimport randomX = 2 * np.random.rand(100, 1)y = 4 + 3 * X + np.random.randn(100, 1)X_b = np.c_[np.ones((100, 1)), X]# print(X_b)n_epochs = 500t0, t1 = 5, 50m = 100num = [i for i in range(100)]def learning_schedule(t): return float(t0) / (t + t1)theta = np.random.randn(2, 1)batch_num = 5batch_size = m // 5# epoch 是轮次的意思,意思是用m个样本做一轮迭代for epoch in range(n_epochs): # 生成100个不重复的随机数 for i in range(batch_num): start = ibatch_size end = (i+1)batch_size xi = X_b[start:end] yi = y[start:end] gradients = 1/batch_size * xi.T.dot(xi.dot(theta)-yi) learning_rate = learning_schedule(epochm + i) theta = theta - learning_rate * gradientsprint(theta)执行结果展示:6 特征和多项式回归6.1 过拟合的问题过拟合的问题出现在变量()过多的时候,这时候我们没有更多的数据去拟合模型,虽然损失函数的值基本接近于0。6.2 过拟合的解决方法:减少特征的数量(一般不用) 1)手动选择特征数2)模型选择正则化(特征缩放) 保留所有特征,但是减少量级或者参数_j的大小6.2 特征缩放房价预测时, 假设我们不知道房屋面积,但是知道房屋的长宽。 模型设计: h(x) = 0 + 1 x 房屋的长度 + 2 x 房屋的宽度特征未缩放图形展示特征缩放图形展示注:如果我们采用多项式回归模型,在运行梯度下降算法前,特征缩放非常有必要。6.3 正则化如何不想要theta3和theta4?首先, 我们可以在损失函数中,加入关于theta3和theta4的项, 迫使若损失函数想要最小化, 必须让theta3和theta4尽可能的小。然后正则化, 公式如下图:6.4 L1 正则和 L2 正则的区别L1 会趋向于减少特征值L2 会趋向于保留特征值7 正则化算法与代码实现7.1 Ridge(岭)回归7.1.1 算法理解7.1.2 实现公式7.1.3 代码实现两种实现岭回归的方法:“““岭回归方法一: 岭回归运用了L2正则化”““import numpy as npfrom sklearn.linear_model import Ridgefrom sklearn.linear_model import SGDRegressorX = 2 * np.random.rand(100, 1)y = 4 + 3 * X + np.random.randn(100, 1)# alpha是惩罚项里的alpha, solver处理数据的方法,auto是根据数据自动选择,svd是解析解,sag就是随机梯度下降ridge_reg = Ridge(alpha=1, solver=‘auto’)# 学习过程ridge_reg.fit(X, y)# 预测print(ridge_reg.predict([[1.5], [2], [2.5]]))# 打印截距print(ridge_reg.intercept_)# 打印系数print(ridge_reg.coef_)“““方法二: 岭回归和sgd & penalty=2是等价的”““sgd_reg = SGDRegressor(penalty=‘l2’)sgd_reg.fit(X, y.ravel())print(sgd_reg.predict([[1.5], [2], [2.5]]))# 打印截距print(“W0=”, sgd_reg.intercept_)# 打印系数print(“W1=”, sgd_reg.coef_)7.2 Lasso(拉索)回归7.2.1 算法理解7.2.2 实现公式7.2.3 代码实现”““Lasso 回归Lasso用的是l1的正则化”““import numpy as npfrom sklearn.linear_model import Lassofrom sklearn.linear_model import SGDRegressorX = 2 * np.random.rand(100, 1)y = 4 + 3 * X + np.random.randn(100, 1)lasso_reg = Lasso(alpha=0.15)lasso_reg.fit(X, y)print(lasso_reg.predict([[1.5]]))print(lasso_reg.coef_)sgd_reg = SGDRegressor(penalty=‘l1’, n_iter=1000)sgd_reg.fit(X, y.ravel())print(sgd_reg.predict([[1.5]]))print(sgd_reg.coef_)7.3 Elastic Net回归7.3.1 算法理解7.3.2 实现公式7.3.3 代码实现import numpy as npfrom sklearn.linear_model import ElasticNetX = 2 * np.random.rand(100, 1)Y = 4 + 3 * X + np.random.randn(100, 1)elastic_reg = ElasticNet(alpha=0.15, l1_ratio=0.5)elastic_reg.fit(X, Y)print(elastic_reg.predict([[1.5]]))print(elastic_reg.coef_)print(elastic_reg.intercept_)from sklearn.linear_model import SGDRegressorelastic_reg = SGDRegressor(penalty=‘elasticnet’)elastic_reg.fit(X, Y)print(elastic_reg.predict([[1.5]]))print(elastic_reg.coef_)8 正规方程和梯度下降比较梯度下降:需要选择合适的需要多次迭代当n很大时,效果很好正规方程:不需要选择学习率a不需要迭代需要计算X的转置乘X整体的逆当n很大时,计算很慢总结:根据经验,当特征数量到10000的时候,是会换成梯度下降比较好8.1 多项式回归的梯度下降代码import numpy as npimport matplotlib.pyplot as pltfrom sklearn.preprocessing import PolynomialFeaturesfrom sklearn.linear_model import LinearRegression# 1). 数据准备;# 样本数m = 100X = 6 * np.random.randn(m, 1) - 3Y = 0.5 * X ** 2 + X + 2 + np.random.randn(m, 1)# 2). 处理# 2-1). 将一个高阶方程转化为一个一阶方程;(多元线性回归)# degree:用几维处理数据;poly_features = PolynomialFeatures(degree=2, include_bias=False)# fit_transform === fit() + transform(), 其中transform就是用来做归一化的;X_poly = poly_features.fit_transform(X, Y)# 2-2). 处理一阶方程line_reg = LinearRegression()line_reg.fit(X_poly, Y)print(line_reg.coef_)print(line_reg.intercept_)8.2 不同维度绘制的图形import numpy as npimport matplotlib.pyplot as pltfrom sklearn.preprocessing import PolynomialFeaturesfrom sklearn.linear_model import LinearRegression# 1). 数据准备;# 样本数m = 100X = 6 * np.random.randn(m, 1) - 3Y = 7 * X ** 2 + 5 X + 2 + np.random.randn(m, 1)# plt.plot(X, Y, ‘b.’)# plt.show()# 设置图像维度及线条的字体显示d = {1: ‘g-’, 2: ‘r.’, 10: ‘y’}# d = {2: ‘g-’}for i in d: # 2). 处理 # 2-1). 将一个高阶方程转化为一个一阶方程;(多元线性回归) # degree:用几维处理数据; poly_features = PolynomialFeatures(degree=i, include_bias=False) # fit_transform === fit() + transform(), 其中transform就是用来做归一化的; X_poly = poly_features.fit_transform(X) print(X_poly) # 2-2). 处理一阶方程 line_reg = LinearRegression() line_reg.fit(X_poly, Y) print(line_reg.coef_) print(line_reg.intercept_) y_predict = line_reg.predict(X_poly) plt.plot(X_poly[:, 0], y_predict, d[i])plt.show() ...

April 17, 2019 · 4 min · jiezi

线性回归--原理

线性回归–原理线性回归–python实现(不使用框架)线性回归–sklearn框架实现通常我们学习机器学习都是从线性回归模型开始的。线性回归模型形式简单、易于建模,但是我们可以从中学习到机器学习的一些重要的基本思想。回归一词的由来:这个术语是英国生物学家兼统计学家高尔顿在1886年左右提出来的。人们大概都注意到,子代的身高与其父母的身高有关。高尔顿以父母的平均身高X作为自变量,其一成年儿子的身高Y为因变量。他观察了1074对父母及其一成年儿子的身高,将所得(X, Y)值标在直角坐标系上,发现二者的关系近乎一条直线,总的趋势是X增加时Y倾向于增加,这是意料中的结果.有意思的是,高尔顿对所得数据做了深入一层的考察,而发现了某种有趣的现象。高尔顿算出这1074个X值的算术平均为68英寸(1英寸为2.54厘米),而1074个Y值的算术平均为69英寸,子代身高平均增加了1英寸,这个趋势现今人们也已注意到。以此为据,人们可能会这样推想:如果父母平均身高为a英寸,则这些父母的子代平均身高应为a+1英寸,即比父代多1英寸。但高尔顿观察的结果与此不符,他发现:当父母平均身高为72英寸时,他们的子代身高平均只有71英寸,不仅达不到预计的72+1=73英寸,反而比父母平均身高小了。反之,若父母平均身高为64英寸,则观察数据显示子代平均身高为67英寸,比预计的64+1=65英寸要多。高尔顿对此的解释是:大自然有一种约束机制,使人类身高分布保持某种稳定形态而不作两极分化。这就是种使身高“回归于中心“的作用。例如,父母身高平均为72英寸,比他们这一代平均身高68英寸高出许多,“回归于中心”的力量把他们子代的身高拉回来些:其平均身高只有71英寸,反比父母平均身高小,但仍超过子代全体平均69英寸。反之,当父母平均身高只有64英寸,远低于他们这代的平均值68英寸时,“回归于中心”的力量将其子代身高拉回去一些,其平均值达到67英寸,增长了3英寸,但仍低于子代全体平均值69英寸。正是通过这个例子,高尔顿引人了“回归”这个名词。线性回归的模型形如:线性回归得出的模型不一定是一条直线,在只有一个变量的时候,模型是平面中的一条直线;有两个变量的时候,模型是空间中的一个平面;有更多变量时,模型将是更高维的。 线性回归模型有很好的可解释性,可以从权重W直接看出每个特征对结果的影响程度。线性回归适用于X和y之间存在线性关系的数据集,可以使用计算机辅助画出散点图来观察是否存在线性关系。例如我们假设房屋价格和房屋面积之间存在某种线性关系,画出散点图如下图所示。看起来这些点分布在一条直线附近,我们尝试使用一条直线来拟合数据,使所有点到直线的距离之和最小。实际上,线性回归中通常使用残差平方和,即点到直线的平行于y轴的距离而不用垂线距离,残差平方和除以样本量n就是均方误差。均方误差作为线性回归模型的代价函数(cost function)。使所有点到直线的距离之和最小,就是使均方误差最小化,这个方法叫做最小二乘法。代价函数:其中,下面求使J最小的W和b:1.偏导数法偏导数法是非常麻烦的,需要一个一个地计算w。为了方便,这里以单变量线性回归为例。2.正规方程法正规方程使用矩阵运算,可以一次求出W向量。但是当变量(feature)个数大于数据个数时,会导致xTx不可逆,这时候就不能用此方法了。使用正规方程法,如果希望得到的模型带有偏置项b,就要先给数据集X增加全为1的一列,这样才会把b包含在W中;如果不添加,那么模型是强制过原点的。3.梯度下降这里的代价函数J的海森矩阵H是半正定的,因此J一定有全局最小值,所以也可以使用梯度下降法来求解。梯度下降法是一种迭代解法,不仅可以求解最小二乘问题,也适用于其它代价函数的问题。但是需要设置学习率,设置的过大或过小,都不能很好地训练出模型,而且梯度下降法需要对数据集进行特征缩放。一般会在数据集特别大的时候或者xTx不可逆的时候使用梯度下降法,后面再做介绍。4.其他还有一些方法就不一一列举了。例如奇异值分解,QR分解,乔姆斯基分解等等。计算出的模型如下图。再放一个两个变量的情况的,如下图。

January 17, 2019 · 1 min · jiezi