線性迴歸與邏輯迴歸python實現

1、線性迴歸

定義一個線性迴歸類LinearRegression

只使用一個庫numpy

在一開始導入

from numpy import *

(1)先進行初始化

由於傳入的是訓練樣本X以及標籤y,所以初始化函數爲:

def __init__(self, X, y):
    self.m = len(X)
    self.n = len(X[0])
    self.theta = ones((self.n, 1))
    self.X = mat(X)
    self.y = mat(y).transpose()

這裏m表示訓練樣本的數量,n表示特徵的維度,theta是需要計算的參數。

(2)計算損失函數

損失函數公式如下:


可能有的公式會除以一個訓練樣本的大小m,由於m是一個常數,除不除都沒有什麼影響,關係不大。我這裏採用的是不除,個人感覺看的清爽一些。

代碼如下:

    def costFunction(self):
        h = dot(self.X, self.theta)
        J = 0.5  * sum(array((self.y - h)) ** 2)
        if isnan(J):
            return (inf)
        return J

(3)計算梯度

梯度計算公式如下:


與損失函數一樣,可能有的公式會除以一個訓練樣本的大小m,由於m是一個常數,除不除都沒有什麼影響,關係不大。我這裏依舊採用的是不除,個人感覺看的清爽一些。

代碼如下:

h = dot(self.X, self.theta)
self.grad = transpose(self.X).dot(self.y - h)

使用梯度下降的完整代碼:

    def gradientDescent(self, alpha):
        h = dot(self.X, self.theta)
        self.grad = transpose(self.X).dot(self.y - h)
        self.theta = self.theta + alpha * self.grad

(4)進行訓練

    def train(self, iterations=1000, alpha=0.01, method=0):
        for k in range(iterations):
            self.gradientDescent(alpha)

詳細代碼請看:

https://github.com/2014214128/regression_model/blob/master/LinearRegression.py

實例一:

python train.py --s 0 --trainfile trainfile\train_linear.txt --modelfile modelfile\model_linear.txt

輸出:

theta:
[[1.77179994]
 [2.87766185]]
cost:
3.2566489362105466

2、邏輯迴歸

定義一個邏輯迴歸類LogisticRegression

只使用一個庫numpy

在一開始導入

from numpy import *

(1)先進行初始化

由於傳入的是訓練樣本X以及標籤y,所以初始化函數爲:

def __init__(self, X, y):
    self.m = len(X)
    self.n = len(X[0])
    self.theta = ones((self.n, 1))
    self.X = mat(X)
    self.y = mat(y).transpose()

這裏m表示訓練樣本的數量,n表示特徵的維度,theta是需要計算的參數。

(2)計算損失函數

損失函數公式如下:

代碼如下:

    def sigmiod(self, x):
        return 1.0 / (1.0 + exp(-1.0 * x))

    def costFunction(self):
        h = self.sigmiod(dot(self.X, self.theta))
        J = -1.0  * (log(h).T.dot(self.y) + log(1 - h).T.dot(1 - self.y))
        if isnan(J[0]):
            return (inf)
        return J[0]

(3)計算梯度

梯度計算公式如下:

其中


代碼如下:

h = self.sigmiod(dot(self.X, self.theta))
self.grad = transpose(self.X).dot(self.y - h)

使用梯度上升完整代碼:

    def gradientAscent(self, alpha):
        h = self.sigmiod(dot(self.X, self.theta))
        self.grad = transpose(self.X).dot(self.y - h)
        self.theta = self.theta + alpha * self.grad
(4)進行訓練
    def train(self, iterations=1000, alpha=0.01, method=0):
        for k in range(iterations):
            self.gradientAscent(alpha)

詳細代碼請看:

https://github.com/2014214128/regression_model/blob/master/LogisticRegression.py

實例二:

python train.py --s 1 --trainfile trainfile\train_logistic.txt --modelfile modelfile\model_logistic.txt

輸出:

theta:
[[13.29983403]
 [ 1.15405399]
 [-1.8092296 ]]
cost:
[[9.37622416]]

博客中使用的所有數據集以及代碼在項目regression_model中均可找到

項目地址如下:

https://github.com/2014214128/regression_model

希望對大家理解迴歸模型有所幫助!

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