多元线性回归 及其Python实现

版权声明:如有疑问,欢迎交流 https://blog.csdn.net/weixin_43682721/article/details/89047685

多元线性回归 Python实现

多元线性回归求解过程

多元线性回归的形式:
在这里插入图片描述
目标函数:
在这里插入图片描述
将一个样本的向量化:

在这里插入图片描述
将所有样本的向量化:
在这里插入图片描述
向量化后的目标函数及求解结果:
在这里插入图片描述
ps.上述多元线性回归的正规方程解问题是:事件复杂度高;优点是:不需要对数据进行归一化处理。

多元线性回归的Python实现:

import numpy as np
#r2_score、train_test_split方法封装在kNN文件下,直接调用
import sys
sys.path.append("..")
from kNN.metrics import r2_score
from sklearn import datasets
from kNN.model_selection import train_test_split

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

  def fit_normal(self,X_train,y_train):
    '''根据训练数据集X_train,y_train训练模型'''
    assert X_train.shape[0] == y_train.shape[0],'the number of X_train must equal to the number 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):
    assert self._theta is not None,'must fit before predict'
    assert X_predict.shape[1] == len(self.coef_),'the feature number of X_predict must equal to X_train '

    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):
    '''根据测试数据集确定当前模型的准确度'''
    y_predict = self.predict(X_test)
    return r2_score(y_test,y_predict)
  
  def __repr__(self):
    return 'LinearRegression()'

#使用
boston = datasets.load_boston()

x = boston.data
y = boston.target  
x = x[y<50.0]
y = y[y<50.0]

X_train,X_test,y_train,y_test = train_test_split(x,y,seed = 666)

reg = LinearRegression()
reg.fit_normal(X_train,y_train)
y_predict = reg.predict(X_test)
print(r2_score(y_test,y_predict))

scikit-learn中的线性回归使用

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn import datasets


boston = datasets.load_boston()

X = boston.data
y = boston.target  
X = X[y<50.0]
y = y[y<50.0]

X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=666)

reg = LinearRegression()
reg.fit(X_train,y_train)

print(reg.coef_)
print(reg.intercept_)
print(reg.score(X_test,y_test))

线性回归的可解释性和更多思考

线性回归的优点——具有可解释性:所求得的每个特征所对应的θ,其正负代表结果与其正相关还是负相关,绝对值大小表示相关性的强弱程度。
线性回归是典型的参数学习;kNN为非参数学习。
线性回归只能解决回归问题;kNN既可以解决分类问题,又可以解决回归问题。
在使用线性回归算法时,对数据有假设:数据具有线性关系。

猜你喜欢

转载自blog.csdn.net/weixin_43682721/article/details/89047685