深度学习之 LinearRegression(多元线性回归)

    科技2022-08-31  133

    深度学习之 LinearRegression(多元线性回归)

    1、多线线性回归的实现

    ​ 跟简单线性回归一样都是y-x的映射关系,多元线性回归只是x是多个样本,简单线性回归就是y(预测) = ax(i) +b,而多元线性回归则是如下图。

    1.1、列出损失函数

    1.2、生成x_b

    新增了一列全为一的列。

    1.3、求出θ

    1.4、根据算出来的θ,求出预测的y⑧

    1.5、求R_Square

    2、代码实现

    2.1、初始化未知量
    def __init__(self): self.coef_ = None #系数从1-n self.interception = None #系数为0的theta self._theta = None
    2.2、写出训练方法
    def fit_normal(self, X_strain, y_strain): #训练出theta X_b = np.hstack([np.ones((len(X_strain),1)),X_strain]) self._theta = np.linalg.inv((X_b.T.dot(X_b))).dot(X_b.T).dot(y_strain) #求全部theta self.coef_ = self._theta[1:] self.interception = self._theta[0] return self
    2.3、写出预测方法
    def predict(self,X_predict): #求预测的数,传入的是x矩阵 X_b = np.hstack([np.ones(len(X_predict), 1), X_predict]) return X_b.dot(self._theta) #返回的是经过训练计算出来的结果
    3.4、求R_Square
    def R_Square(self , x_train , y_trian): #返回r平方 return 1 - ((self.predict(x_train) - y_trian).dot(self.predict(x_train) - y_trian) / (np.mean(y_trian) - y_train).dot(np.mean(y_trian) - y_train))

    3、实例代码

    from matplotlib import pyplot as plt import pandas as pd import numpy as np from Regression import SimpleRegression from sklearn import datasets from sklearn.model_selection import train_test_split class LinearRegression(): def __init__(self): self.coef_ = None #系数从1-n self.interception = None #系数为0的theta self._theta = None def fit_normal(self, X_strain, y_strain): #训练出theta X_b = np.hstack([np.ones((len(X_strain),1)),X_strain]) self._theta = np.linalg.inv((X_b.T.dot(X_b))).dot(X_b.T).dot(y_strain) #求全部theta self.coef_ = self._theta[1:] self.interception = self._theta[0] return self # def predict(self,X_predict): #求预测的数 # X_b = np.hstack([np.ones(len(X_predict), 1), X_predict]) # return X_b.dot(self._theta) #返回的是经过训练计算出来的结果 def predict(self, _predict): #测试函数 X_b = np.hstack([np.ones((len(_predict),1)),_predict]) return X_b.dot(self._theta) def R_Square(self , x_train , y_trian): #返回r平方 return 1 - ((self.predict(x_train) - y_trian).dot(self.predict(x_train) - y_trian) / (np.mean(y_trian) - y_train).dot(np.mean(y_trian) - y_train)) if __name__ == '__main__': boston = datasets.load_boston() x = boston.data y = boston.target X_train,X_text,y_train,y_text = train_test_split(x,y,train_size=0.8) my_reg = LinearRegression() my_reg.fit_normal(X_train,y_train) print(my_reg.interception) print(my_reg.predict(X_text)) print(my_reg.R_Square(X_text,y_text))

    4、直接调用sklearn中的函数

    4.1、直接调用写好的封装好的函数 LinearRegression类
    from sklearn.linear_model import LinearRegression from sklearn import datasets from sklearn.model_selection import train_test_split #直接调用封装好的 boston = datasets.load_boston() x = boston.data y = boston.target X_train,X_text,y_train,y_text = train_test_split(x,y,train_size=0.8) my_reg = LinearRegression() my_reg.fit(X_train,y_train) print(my_reg.intercept_) print(my_reg.coef_) print(my_reg.predict(X_text)) print(my_reg.score(X_text,y_text))
    4.2、sklearn拥有的参数有,直接使用即可

    4.3、理解其中参数的含义
    my_reg.coef_ [-1.27534647e-01 4.68077544e-02 1.41567062e-02 1.61650955e+00 -1.75715965e+01 4.50077752e+00 -9.50204473e-03 -1.58102201e+00 2.63574512e-01 -1.18220060e-02 -9.36185192e-01 9.57378376e-03 -4.17866505e-01] #表示相关性,如果为-表示此特征与房价成负相关,如果为+表示此特征与房价成正相关,也就是说房价越高,如果是正相关说明特征越大房价就会越高 #按照大小顺序排列 print(np.argsort(my_reg.coef_)) [ 4 7 10 12 0 9 6 11 1 2 8 3 5] #前面的负相关成都高的,大的是正相关高的 #按照相应的名称进行输出 print(boston.feature_names[np.argsort(my_reg.coef_)] ) ['NOX' 'DIS' 'PTRATIO' 'LSTAT' 'CRIM' 'TAX' 'AGE' 'B' 'ZN' 'INDUS' 'RAD' 'CHAS' 'RM']
    Processed: 0.008, SQL: 9