学习笔记: 机器学习经典算法-多元线性回归的正规方程解

简介: 机器学习经典算法-个人笔记和学习心得分享

简单线性回归刻画的是样本的 1维特征与样本输出标记之间的关系;对于样本的多特征,刻画多特征与输出标记之间的多元线性关系描述为$ y = \theta_{0} + \theta_{1}x_{1} + \theta_{2}x_{2}... + \theta_{n}x_{n}$。

1、多元线性回归的目标函数

求解多元线性回归的目标函数同简单线性回归一样,使预测结果与真实结果的误差尽可能小:
$$\sum^{m}_{i} {(\hat y^{(i)} - y^{(i)})^{2}}$$
$$ \hat y^{(i)} = \theta_{0}x_{0}^{(i)} + \theta_{1}x_{1}^{(i)} ... + \theta_{n}x_{n}^{(i)},x_{0}^{(i)} = 1$$

$$\theta = (\theta_{0} ,\theta_{1} ,... ,\theta_{n} )^{T},X^{(i)}= (x_{0}^{(i)},x_{1}^{(i)},...,x_{n}^{(i)})$$
$$\hat y^{(i)} = \theta \cdot X^{i}$$
推广到多样本形式
$X_{b} = \begin{bmatrix} 1&x_1^{(1)}&x_2^{(1)}&...&x_n^{(1)} \\ 1&x_1^{(2)}&x_2^{(2)}&...&x_n^{(2)} \\ ... \\ 1&x_1^{(m)}&x_2^{(m)}&...&x_n^{(m)} \end{bmatrix}, \theta = \begin{bmatrix} \theta_{0} \\ \theta_{1} \\ ... \\ \theta_{n}\end{bmatrix}$
在$\theta$里,$\theta_{0}$对应回归关系式中的截距(intercept)或者说偏移,与样本特征无关;$\theta_{1}...\theta_{n}$是系数(coefficients),它们描述的是特征对样本输出标记的贡献程度。

$\therefore \hat y = X_{b} \cdot \theta$

带入$\hat y $,目标函数写为$\sum^{m}_{i} {(\hat y^{(i)} - y^{(i)})^{2}} = (y - X_b\cdot\theta)^{T} (y - X_b\cdot\theta)$

2、多元线性回归的数学解

2.1 正规方程解的数学表达式

通过使得目标函数$(y - X_b\cdot\theta)^{T} (y - X_b\cdot\theta)$尽可能得小来求解$\theta$,求解方法同简单线性回归一样使用最小二乘法,对函数中的每个$\theta _{i}$求偏导。由于运算对象从单个数变成了矩阵, 在矩阵上求导求极值的推导过程有点复杂(涉及线代以外的知识)。
多元线性回归的正规方程解(Normal Equation)
$$\theta = (X_{b}^{T}X_{b})^{-1}X_{b}^{T}y$$
缺点:正规方程解的时间复杂度高:$O(n^3)$,其中$n$不区分高维矩阵的行数或列数。
优点:不需要对数据进行归一化处理,最后的$\theta$就是原始数据的方程运算结果。

2.2 python实现

class LinearRegression:
    def __init__(self):
        """初始化Linear Regression 模型"""
        self.coef_ = None
        self.interception_ = None
        self._theta = None
    def fit(self,x_train,y_train):
        """根据训练集x_train,y_train训练Linear Regression 模型"""
        assert x_train.shape[0] == y_train.shape[0], "the size of x_train must be equal to the size of y_train"

        X_b = np.hstack([np.ones((len(x_train),1)),x_train])
        self._theta = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y_train);
        self.interception_ = self._theta[0]
        self.coef_ = self._theta[1:]

        return self

    def predict(self,x_predict):
        """给定待预测数据集x_predict,返回表示x_predict的结果向量"""
        assert self.interception_ is not None and self.coef_ is not None, "must fit before predict!"
        assert x_predict.shape[1] == len(self.coef_)," the feature number of x_predict must be equal to x_train"

        X_b = np.hstack([np.ones((len(x_predict),1)),x_predict])
        return X_b.dot(self._theta)

    def __repr__(self):
        return "LinearRegression()"


### 算法测试
### prepare data
from sklearn import datasets
boston = datasets.load_boston()
x = boston.data[ boston.target < 50 ]
y = boston.target[boston.target < 50]
from sklearn.model_selection import train_test_split
Train_X,Test_X,Train_Y,Test_Y = train_test_split(x,y,test_size= 0.2,random_state=666)

### test method
reg = LinearRegression()
reg.fit(Train_X,Train_Y)
reg.predict(Test_X)

3、scikit-learn框架下的回归求解

3.1 多元线性回归

from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(Train_X,Train_Y)
lin_reg.coef_ ### 系数贡献度
lin_reg.intercept_ ### 关系式偏移
lin_reg.score(Test_X,Test_Y) ### 模型准确度得分

3.2 kNN Regressor

算法背景 ML- kNN(k近邻算法)

from sklearn.neighbors import KNeighborsRegressor
### kNN模型超参数网格搜索
knn_reg = KNeighborsRegressor()
param_grid = [
    {
        'weights':['uniform'],
        'n_neighbors':[i for i in range(1,11)]
    },
    {
        'weights':['distance'],
        'n_neighbors':[i for i in range(1,11)],
        'p':[i for i in range(1,6)]
    }
]
from sklearn.model_selection import GridSearchCV
grid_search = GridSearchCV(knn_reg,param_grid,n_jobs= 6, verbose = 2)
grid_search.fit(Train_X,Train_Y)
print(grid_search.best_estimator_)
### 使用网格搜索得到的最优超参数训练模型
knn_reg = grid_search.best_estimator_
knn_reg.predict(Test_X)
knn_reg.score(Test_X,Test_Y)

4、线性回归的可解释性

对于线性回归的系数(coefficients)来说,特征前面的系数为正意味着该特征与样本的输出标记呈正相关关系,系数为负表明负相关;系数的绝对值大小代表了相关程度。对系数按大小排序,从而用来筛选对样本的输出标记最相关的特征。因此,对于拿到的一组数据,不管数据的输出标记与特征之间有何关系,都可以首先通过线性回归的处理对数据的特征进行一定的了解。

5、线性回归的特点

① 典型的参数学习算法:
② 只能解决回归问题;对比kNN,既可以解决分类问题又能解决回归问题。
③ 对数据有前提假设:线性关系;只有数据集本身具有很强的线性关系,线性回归的结果才能更好(比如kNN也能处理回归,但回归误差就不如线性回归)。
⑤ 最大优点:线性回归是一个白盒子算法,训练出的模型和参数可以解释数据集的内在关联。

目录
相关文章
|
30天前
|
机器学习/深度学习 人工智能 自然语言处理
【MM2024】阿里云 PAI 团队图像编辑算法论文入选 MM2024
阿里云人工智能平台 PAI 团队发表的图像编辑算法论文在 MM2024 上正式亮相发表。ACM MM(ACM国际多媒体会议)是国际多媒体领域的顶级会议,旨在为研究人员、工程师和行业专家提供一个交流平台,以展示在多媒体领域的最新研究成果、技术进展和应用案例。其主题涵盖了图像处理、视频分析、音频处理、社交媒体和多媒体系统等广泛领域。此次入选标志着阿里云人工智能平台 PAI 在图像编辑算法方面的研究获得了学术界的充分认可。
【MM2024】阿里云 PAI 团队图像编辑算法论文入选 MM2024
|
17天前
|
机器学习/深度学习 算法 Java
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
|
25天前
|
机器学习/深度学习 人工智能 算法
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集('矮花叶病', '健康', '灰斑病一般', '灰斑病严重', '锈病一般', '锈病严重', '叶斑病一般', '叶斑病严重'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。再使用Django搭建Web网页操作平台,实现用户上传一张玉米病害图片识别其名称。
50 0
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
|
1月前
|
机器学习/深度学习 算法 决策智能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
|
30天前
|
机器学习/深度学习 算法 Python
探索机器学习中的决策树算法:从理论到实践
【10月更文挑战第5天】本文旨在通过浅显易懂的语言,带领读者了解并实现一个基础的决策树模型。我们将从决策树的基本概念出发,逐步深入其构建过程,包括特征选择、树的生成与剪枝等关键技术点,并以一个简单的例子演示如何用Python代码实现一个决策树分类器。文章不仅注重理论阐述,更侧重于实际操作,以期帮助初学者快速入门并在真实数据上应用这一算法。
|
6天前
|
机器学习/深度学习 人工智能 算法
探索机器学习中的决策树算法
【10月更文挑战第29天】本文将深入浅出地介绍决策树算法,一种在机器学习中广泛使用的分类和回归方法。我们将从基础概念出发,逐步深入到算法的实际应用,最后通过一个代码示例来直观展示如何利用决策树解决实际问题。无论你是机器学习的初学者还是希望深化理解的开发者,这篇文章都将为你提供有价值的见解和指导。
|
1月前
|
机器学习/深度学习 算法 大数据
机器学习入门:梯度下降算法(下)
机器学习入门:梯度下降算法(下)
|
1月前
|
机器学习/深度学习 算法 API
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
|
27天前
|
机器学习/深度学习 算法 数据处理
EM算法对人脸数据降维(机器学习作业06)
本文介绍了使用EM算法对人脸数据进行降维的机器学习作业。首先通过加载ORL人脸数据库,然后分别应用SVD_PCA、MLE_PCA及EM_PCA三种方法实现数据降维,并输出降维后的数据形状。此作业展示了不同PCA变种在人脸数据处理中的应用效果。
29 0
|
1月前
|
机器学习/深度学习 算法
机器学习入门:梯度下降算法(上)
机器学习入门:梯度下降算法(上)