目录
最大似然估计和最小二乘法是机器学习中经常用到的两种方法,它们既有区别又有千丝万缕的联系,而且容易搞混,今天我们以简单的线性回归为例(简单到没有偏执,只有权重w),简单介绍一下两种算法。
使用最小二乘法解决线性回归问题,我们需要确定参数w,使估计值和观测值之差的平方和最小,其推导过程如下:
(1)
很显然上式是凸函数,我们要让误差L最小,只需要让L对w的一阶导数等于0,解方程:
(2)
(3)
我们使用最大似然估计解决线性回归问题,需要确定参数w,使得从模型中抽取该n组样本观测值的概率最大,也就是概率分布函数或者说是似然函数最大.因此最大似然估计需要已知这个概率分布函数。
在现实中,通过线性拟合,我们基本不可能让直线精确无误的通过每一个样本点,使得拟合出来的直线的误差为0。因为样本数据本身是带有噪声的,带有随机性的。似然估计假设真的实际存在一条线能完美的反应实际的数据分布(这就是所谓的分布假设),而数据之所以没有全部在这条线上,是观测误差,我们可以假设这个误差符合高斯分布。
直观点说,我们看最上面那幅图,所有的样本点都围绕着直线上下,在直线附近上下夹杂着这种随机的噪声。那么意味着:拟合出来的直线代表了样本数据的确定性,而拟合值和观测值之间的误差,也可以称之为是噪声,则代表了随机性。这种带有随机性的噪声我们就可以用符合某个分布的随机变量来描述,比如高斯分布。
首先假设线性回归模型如下:
(4)
其中误差 ,也就是说,用最大似然估计推导如下,要做的是最大化Q:
(5)
因为上式中第二项没有参数w,所以可以舍掉,简化得到如下式子:
要做的是最小化上面的L,这就得出了(1)式,和最小二乘法一样了。
其实,就算不是线性回归问题,那么分布假设叠加上高斯噪声的最大似然估计和最小二乘估计也是等价的。
分布假设叠加上高斯噪声公式如下:
似然函数是:
因为 ,所以得到:
去掉后面不包含的两项, 做后得出一最小二乘法相同的式子:
我们已经波士顿房价数据集为例,根据历史房价数据建立回归模型,预测不同类型房屋的价格。数据集链接:http://t.csdn.cn/t5VcH
- import pandas as pd
- from sklearn import preprocessing
- from sklearn.model_selection import train_test_split
- from sklearn.linear_model import LinearRegression,Lasso,ElasticNet
- from sklearn.metrics import r2_score
- from sklearn.metrics import mean_squared_error
- import matplotlib.pyplot as plt
- import seaborn as sn
-
- data = pd.read_csv("HousingData.csv")#读取csv
- y = data['MEDV'] # 标签-房价
- X = data.drop(['MEDV'], axis=1) #去掉标签(房价)的数据子集
- # X_train为训练数据, y_train为训练集标签,X_test为测试数据,y_test为测试集标签。
- # 抽取70%的数据作为训练集, 用剩余样本进行分类结果测试。
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
- scaler=preprocessing.StandardScaler().fit(X_train)
- # Z-score标准化,在训练集上训练,在训练集与测试集上标准化,泛化时标准化也用训练集上的训练结果。
- X_train=scaler.transform(X_train)
- X_test=scaler.transform(X_test)
- # 模型构建\训练\预测\评价
- lr = LinearRegression() #实例化一个线性回归对象
- lr.fit(X_train, y_train) #采用fit方法,拟合回归系数和截距
- print(lr.intercept_) #输出截距
- print(lr.coef_) #输出系数 可分析特征的重要性以及与目标的关系
- y_pred = lr.predict(X_test)#模型预测
- print("R2=", r2_score(y_test, y_pred))#模型评价, 决定系数
- #print("mse=",mean_squared_error(y_test, y_pred))#均方误差
- #print(lr.intercept_) #输出截距
- #print(lr.coef_) #系数
- # 可视化
- plt.plot(y_test.values, c="r", label="y_test")
- plt.plot(y_pred, c="b", label="y_pred")
- plt.legend()
- plt.show()
1.最大的不同在于思想不同,最小二乘法通过缩小预测值和观测值得距离来确定参数;最大似然估计通过最大化观测值出现的概率来确定参数。
2.最大似然估计是需要有分布假设的,属于参数统计;而最小二乘法则没有这个假设。
3.最小二乘法是一个凸优化问题,最大似然估计不一定是。
1.两者都把估计问题变成了最优化问题。
2.对于噪声符合高斯分布的数据,使用最小二乘法和最大似然估计是等价的。