欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

机器学习 多元线性回归 多元线性回归计算

最编程 2024-03-01 21:39:01
...


多元线性回归的思路

机器学习 多元线性回归 多元线性回归计算_机器学习 多元线性回归

和简单线性回归相比 x 由一个特征,变为一个向量 X,含有多个特征。

找出一条直线(多维度实际不是直线,只是为了形象描述),最大程度的拟合 所有的点;

直线的方程是 

机器学习 多元线性回归 多元线性回归计算_机器学习 多元线性回归_02

 ,X , 和Y都是已知的,只需要求出 每一个

 即可,所求的

也是一个向量;

思路:

机器学习 多元线性回归 多元线性回归计算_多元线性回归_03

和简单线性回归一样,让预测结果和真实的结果的差值的平方 尽可能的小;

方法:

机器学习 多元线性回归 多元线性回归计算_多元线性回归_04

先看 

 ,

中的

实际为一个行向量,首先将

转置为一个列向量

 ;然后对

 的式子做一点改变: 在 

 前也乘一个系数 

 ,但是不改变原式子,所以让

 

 1。

机器学习 多元线性回归 多元线性回归计算_机器学习 多元线性回归_05

 

所以

 就变成了:

机器学习 多元线性回归 多元线性回归计算_线性回归_06

 

因此,显而易见的 

 就可以写成两个向量的点乘:

机器学习 多元线性回归 多元线性回归计算_机器学习 多元线性回归_07

然后把这个式子推广到整个的

 和 

 中:

机器学习 多元线性回归 多元线性回归计算_线性回归_08

其中 

 和 

 为:

 

机器学习 多元线性回归 多元线性回归计算_机器学习 多元线性回归_09

即 原来的

矩阵 在第一列加了一个元素全部为1 的列向量,

是(m,n)的矩阵,所以

 为(m,n+1)的矩阵; 

即我们需要求的所有

组成的矩阵(每个X前的系数,和一个截距),一共有n 个X(特征),再加一个截距,所以

是一个(n+1,1)的矩阵。所得结果

:为 所有的预测值组成的向量 ;所以这是一个矩阵的乘法所得到的结果,

是一个(m , n+1)的矩阵,

是一个(n+1,1)的矩阵;(矩阵的乘法的规则,

的每一行的元素和

的每一列的元素相乘再相加得到结果,是一个(m , 1)的矩阵)

将  

机器学习 多元线性回归 多元线性回归计算_线性回归_08

带入目标函数,并将目标函数向量化:  

机器学习 多元线性回归 多元线性回归计算_机器学习 多元线性回归_11

在目标函数中,对第一个

 进行了转置,这是为了方便使用矩阵的乘法;转置之后,第一个式子为(1,m)的行向量,第二个式子为(m,1)的列向量;所以最终结果为一个值。目标函数中 


 都是已知的,所以只需要求出

 即可;

的推导在这里不讨论

多元线性回归的正规方程解(Normal Equation):

机器学习 多元线性回归 多元线性回归计算_机器学习 多元线性回归_12

缺点:时间复杂度高:O(n^3) (优化O(n^2.4)); 当我们有上百万个样本,或者上百万个特征的时候,运算时间会非常长;但是能直接求得数学解也是很不错的,因为在机器学习算法中,很少有算法可以直接求出数学解。

优点:不需要对数据做归一化处理;结果是 原始数据运算得到结果,所以不存在量纲的问题;

编写一个自己的LinearRegression 的算法:

注意:

求矩阵的逆矩阵的方法: 

np.linalg.inv()

将两个矩阵在水平方向上堆叠起来的方法:

np.hstack([矩阵1,矩阵2]

具体代码如下:

import numpy as np
class LinearRegression():

    def __init__(self):
        '''初始化Linear Regression 模型'''
        self.coef_ = None
        self.interception_ = None
        self._theta = None

    def fit_normal(self , X_train , y_train):

        assert X_train.shape[0] == y_train.shape[0]

        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.coef_ = self._theta[1:]
        self.interception_ = self._theta[0]

        return self

    def predict(self, X_predict):
        assert self.interception_ is not None and self.coef_ is not None
        assert X_predict.shape[1] == len(self.coef_.shape)

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

    def score(self,X_test ,y_test):
        assert self.interception_ is not None and self.coef_ is not None
        y_predict = self.predict(X_test)
        r2_score = 1-  (np.sum((y_test-y_predict)**2)/len(y_test))/np.var(y_test)
        return r2_score


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