线性回归与逻辑回归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

希望对大家理解回归模型有所帮助!

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