5-1 線性迴歸算法

1. 線性迴歸算法簡介

線性迴歸算法的特點

  • 解決迴歸問題
  • 思想簡單,容易實現
  • 許多強大的非線性模型的基礎  (邏輯迴歸\多項式迴歸\SVM等)
  • 結果具有很好的可解釋性
  • 蘊含機器學習中的很多重要思想

分類問題和迴歸問題的區別

分類問題,座標軸都是特徵, 顏色代表樣本的輸出標記(離散)

迴歸問題,橫軸是特徵,縱軸是樣本的輸出標記,樣本的輸出標記在一個連續的空間裏

簡單線性迴歸的思想(擬合方程\損失函數)

簡單線性迴歸(只有一個特徵)

多個特徵是多元線性迴歸

總體思想: 找到一組參數值使得某個函數(損失函數)儘可能的小

[機器學習中的參數學習算法就是創建一個模型, 然後學習模型的參數===>找到這些參數使得可以最優化損失函數

 近乎所有參數學習算法都是這樣的套路

模型不同, 建立的目標函數不同, 優化的方式不同]

簡單線性迴歸通過最小二乘法最優化損失函數

a,b表達式的具體推導過程: 用最小二乘法求解參數a, b(分別對每個參數求偏導數,並另偏導數=0)

更改成更容易提高計算效率的形式(利用n\bar x = \sum_{i=1}^n x_i)


2. 實現簡單線性迴歸算法

與KNN.py不同的是, 簡單線性迴歸不需要保存X_train和y_train,只需要保存根據用戶傳入的訓練集計算出的模型參數

predict的時候只需要參數即可

import numpy as np

class SimpleLinearRegression1:

    def __init__(self):
        """初始化模型"""
        self.a_ = None
        self.b_ = None



    def fit(self, x_train, y_train):
        """根據訓練集數據訓練模型"""
        assert x_train.ndim == 1
        assert len(x_train) == len(y_train)

        x_mean = np.mean(x_train)
        y_mean = np.mean(y_train)

        num = 0.0
        d = 0.0

        for x, y in zip(x_train, y_train):
            num += (x - x_mean) * (y - y_mean)
            d += (x - x_mean) ** 2

        self.a_ = num / d
        self.b_ = y_mean - self.a_ * x_mean

        return self

    def predict(self, x_predict):
        """給定待預測數據集x_predict, 返回表示x_predict的結果向量"""
        assert x_predict.ndim == 1
        assert self.a_ is not None and self.b_ is not None

        return np.array([self.predict(x_single) for x_single in x_predict])

    def _predict(self, x_single):
        """給定單個待預測數據x_single"""
        return self.a_ * x_single + self.b_

    def __repr__(self):
        """object 類提供的 __repr__() 方法總是返回該對象實現類的“類名+object at+內存地址”值,這個返回值並不能真正實現“自我描述”的功能,因此,如果用戶需要自定義類能實現“自我描述”的功能,就必須重寫 __repr__() 方法"""
        return "simplelinearregression1()"

向量化運算

不使用for循環

import numpy as np

class SimpleLinearRegression2:

    def __init__(self):
        """初始化模型"""
        self.a_ = None
        self.b_ = None



    def fit(self, x_train, y_train):
        """根據訓練集數據訓練模型"""
        assert x_train.ndim == 1
        assert len(x_train) == len(y_train)

        x_mean = np.mean(x_train)
        y_mean = np.mean(y_train)

        num = (x_train - x_mean).dot(y_tain - y_mean)
        d = (x_train - x_mean).dot(x_train - x_mean)

        #for x, y in zip(x_train, y_train):
        #   num += (x - x_mean) * (y - y_mean)
        #   d += (x - x_mean) ** 2

        self.a_ = num / d
        self.b_ = y_mean - self.a_ * x_mean

        return self

    def predict(self, x_predict):
        """給定待預測數據集x_predict, 返回表示x_predict的結果向量"""
        assert x_predict.ndim == 1
        assert self.a_ is not None and self.b_ is not None

        return np.array([self.predict(x_single) for x_single in x_predict])

    def _predict(self, x_single):
        """給定單個待預測數據x_single"""
        return self.a_ * x_single + self.b_

    def __repr__(self):
        """object 類提供的 __repr__() 方法總是返回該對象實現類的“類名+object at+內存地址”值,這個返回值並不能真正實現“自我描述”的功能,因此,如果用戶需要自定義類能實現“自我描述”的功能,就必須重寫 __repr__() 方法"""
        return "simplelinearregression1()"

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章