LinearnRegression

线性回归

  • 最小二乘法
  • 梯度下降法

最小二乘法

  • 数学原理

    • model:y = \Sigma_{{i=1}}^{{n}}\omega_i x_i +b\\\ \ = \Sigma_{i = 0}^{n}\omega_ix_i (\omega_0=b,x_0=1)

      m个sample,每个sample有n个特征,引入以下几个记号

      X = \begin{bmatrix}x_{11}\ x_{12} \ ...x_{1n}\\x_{21}\ x_{22} \ ...x_{2n}\\...\ ...\ ...\ ...\\x_{m1}\ x_{m_2}...\ x_{mn}\end{bmatrix}=\begin{bmatrix}x_1^T\\x_2^T\\.\\.\\.\\x_m^T\end{bmatrix}\\ \omega = \begin{bmatrix}\omega_1\\\omega_2\\.\\.\\.\\\omega_n\end{bmatrix}\ y=\begin{bmatrix}y_1\\y_2\\.\\.\\.\\y_m\end{bmatrix}

      我们有:

      y = Xw

    • 均方差:MES E(\omega)= \frac{1}{2m}\Sigma_{i = 1}^m(\hat y_i -y )^2

      梯度:\nabla E(\omega)=\frac{1}{m}\Sigma_{i=1}^m(\hat y_i -y )x_i\\\qquad =\frac{1}{m}X^T(X\omega-y)

      • 注意:E的梯度是一个向量函数,是一个列向量
    • 最小二乘:

      \nabla E=0\\\Rightarrow X^T(X\omega-y)=0\\\Rightarrow\omega = (X^TX)^{-1}(X^Ty)

  • 在编程中遇到的问题

    • python 面向对象编程-类的创建

      • 用class 创立类,调用类的方法之前先创建类的实例;默认类的构建函数init函数参数为空,如果自己定义init注意传参数
      • py和cpp不同,self相当于this指针;没有privatepublic声明,通过命名法区别类的私有函数和公有函数,代表是private的函数
    • python导入数据集

      • 这里使用的是numpy.genfromtxt()函数

        genfromtxt(‘path’;delimiter’分割字符’还有很多参数)

    • 用numpy处理数组

      • 矩阵切片:[ : , : ]“,”前表示行的切片
    • 划分数据集

      • 用到sklearn.model_selection.train_test_split
import numpy as np

#最小二乘法
class olsLinearRegression:
    
    # X预处理
    def _preprocessing(self,X):
        m,n = X.shape
        X_ = np.empty((m,n+1))
        X_[:,:-1] = X
        X_[:,-1] = 1
        
        return X_
    
    #求self.w
    def _ols(self,X,y):
        temp = np.linalg.inv(np.matmul(X.T,X))
        temp_ = np.matmul(X.T,y)
        return np.matmul(temp,temp_)
    
    #训练model
    def train(self,X,y):
        X = self._preprocessing(X)
        self.w = self._ols(X,y)
    
    #做预测
    def predict(self,X):
        X = self._preprocessing(X)
        return np.matmul(X,self.w)

#导入数据集    
data = np.genfromtxt('E:\winequality-red.csv',delimiter = ';',skip_header = True)
X = data[:,:-1]
y = data[:,-1]

#划分数据集
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.3)

#创建类的实例
ols = olsLinearRegression()
#训练模型并得到预测结果
ols.train(X_train,y_train)
y_pred = ols.predict(X_test)

#性能指标:均方差误差
from sklearn.metrics import mean_squared_error
mes = mean_squared_error(y_pred,y_test)
print(mes)
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容