必威体育Betway必威体育官网
当前位置:首页 > IT技术

多元线性回归算法学习笔记

时间:2019-10-17 02:44:02来源:IT技术作者:seo实验室小编阅读:70次「手机版」
 

多元线性回归模型

多元线性回归的思路

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

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

直线的方程是  ,X , 和Y都是已知的,只需要求出 每一个\theta 即可,所求的\theta也是一个向量;

思路:

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

方法:

先看 \hat{y^{^{i}}} ,\hat{y^{^{i}}}中的\theta实际为一个行向量,首先将\theta转置为一个列向量\thete ;

然后对\hat{y^{^{i}}} 的式子做一点改变: 在 \theta_{0} 前也乘一个系数 {X_{0}}^{(i)} ,但是不改变原式子,所以让{X_{0}}^{(i)} \equiv 1。

所以\fn_cm X^{(i)} 就变成了:

因此,显而易见的 \hat{y^{^{i}}} 就可以写成两个向量的点乘:

然后把这个式子推广到整个的 X 和 \hat{y} 中:

其中 X_{b} 和 \theta 为:

X_{b}即 原来的X矩阵 在第一列加了一个元素全部为1 的列向量,X是(m,n)的矩阵,所以X_{b} 为(m,n+1)的矩阵;

\theta即我们需要求的所有\theta组成的矩阵(每个X前的系数,和一个截距),一共有n 个X(特征),再加一个截距,所以\theta是一个(n+1,1)的矩阵。

所得结果\hat{y}:为 所有的预测值组成的向量 ;

所以这是一个矩阵的乘法所得到的结果,X_{b}是一个(m , n+1)的矩阵,\theta是一个(n+1,1)的矩阵;(矩阵的乘法的规则,X_{b}的每一行的元素和\theta的每一列的元素相乘再相加得到结果,是一个(m , 1)的矩阵)

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

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

目标函数中 yX_{b} 都是已知的,所以只需要求出\theta 即可;\theta的推导在这里不讨论

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

缺点时间复杂度高: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()'

相关阅读

排列组合算法

题目:求(1)一组数字的全排列(2)一组数字中某几个数字的组合一、排列算法:全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排

【华为2018年校园招聘】算法岗笔试题

我的个人微信公众号:Microstrong 微信公众号ID:MicrostrongAI 公众号介绍:Microstrong(小强)同学主要研究机器学习、深度学习、计算

排序算法:冒泡排序

冒泡排序是一种交换排序。 什么是交换排序呢? 交换排序:两两比较待排序的关键字,并交换不满足次序要求的那对数,直到整个表都满足次序

BP神经网络的Matlab实现——人工智能算法

这几天在各大媒体上接触到了人工智能机器学习,觉得很有意思,于是开始入门最简单的机器算法——神经网络训练算法(Neural Network Tra

十大经典排序算法总结(Java语言实现)

最近在看排序算法,对此做个总结。参考文章:https://www.cnblogs.com/onepixel/articles/7674659.htmlhttps://www.cnblogs.com/guoy

分享到:

栏目导航

推荐阅读

热门阅读