机器学习-对逻辑回归的理解以及相关代码

本文主要代码来源于《python 机器学习算法》

由于本人觉得在这上面写公式太麻烦了就用纸质的了

总体思路就像纸上写

1.设计预估函数 h(θ)  

2. 设计cost 函数

3.cost 函数求平均 (在这个过程中,回归迭代cost 函数最小)

```

# coding:UTF-8
'''
Date:20160901
@author: zhaozhiyong
'''
import numpy as np


#将data 数据转化为 feature 2维矩阵 和 label 矩阵
def load_data(file_name):
    '''导入训练数据
    input:  file_name(string)训练数据的位置
    output: feature_data(mat)特征
            label_data(mat)标签
    '''
    f = open(file_name)  # 打开文件
    feature_data = []
    label_data = []
    for line in f.readlines():
        feature_tmp = []
        lable_tmp = []
        lines = line.strip().split("\t") #这里去除首位空格,并以\t 分解
        feature_tmp.append(1)  # 偏置项
        for i in xrange(len(lines) - 1): #返回一个生成器
            feature_tmp.append(float(lines[i]))
        lable_tmp.append(float(lines[-1]))

        feature_data.append(feature_tmp)
        label_data.append(lable_tmp)
    f.close()  # 关闭文件
    return np.mat(feature_data), np.mat(label_data)


def sig(x):
    '''Sigmoid函数
    input:  x(mat):feature * w
    output: sigmoid(x)(mat):Sigmoid值
    '''
    return 1.0 / (1 + np.exp(-x))


def lr_train_bgd(feature, label, maxCycle, alpha):
    '''利用梯度下降法训练LR模型
    input:  feature(mat)特征
            label(mat)标签
            maxCycle(int)最大迭代次数
            alpha(float)学习率
    output: w(mat):权重
    '''
    n = np.shape(feature)[1]  # 特征个数 : shape 对应元素个数,即2维过程中列的个数,feature 为2维mat
    print feature
    print feature.T
    w = np.mat(np.ones((n, 1)))  # 初始化权重, 即创建 n * 1 数值为1的矩阵
    i = 0
    while i <= maxCycle:  # 在最大迭代次数的范围内
        i += 1  # 当前的迭代次数
        h = sig(feature * w)  # 计算Sigmoid值
        err = label - h
        if i % 100 == 0:
            print "\t---------iter=" + str(i) + \
                  " , train error rate= " + str(error_rate(h, label))
        w = w + alpha * feature.T * err  # 权重修正 这里就是 wj = wj + a * (t - y) * xj(i)
        # 对上面的 w 参数调整 : 应为err 是一个矩阵,feature.T 也是一个矩阵 err 表示的就是 (H(sita) - y), feature.T 就是对应的Xj(i)
    return w


def error_rate(h, label):
    '''计算当前的损失函数值
    input:  h(mat):预测值
            label(mat):实际值
    output: err/m(float):错误率
    '''
    m = np.shape(h)[0]

    sum_err = 0.0
    for i in xrange(m):
        if h[i, 0] > 0 and (1 - h[i, 0]) > 0:
            sum_err -= (label[i, 0] * np.log(h[i, 0]) + \
                        (1 - label[i, 0]) * np.log(1 - h[i, 0]))
        else:
            sum_err -= 0
    return sum_err / m


def save_model(file_name, w):
    '''保存最终的模型
    input:  file_name(string):模型保存的文件名
            w(mat):LR模型的权重
    '''
    m = np.shape(w)[0]
    f_w = open(file_name, "w")
    w_array = []
    for i in xrange(m):
        w_array.append(str(w[i, 0]))
    f_w.write("\t".join(w_array))
    f_w.close()


if __name__ == "__main__":
    # 1、导入训练数据
    print "---------- 1.load data ------------"
    feature, label = load_data("data.txt")
    # 2、训练LR模型
    print "---------- 2.training ------------"
    w = lr_train_bgd(feature, label, 1000, 0.01)
    # 3、保存最终的模型
    print "---------- 3.save model ------------"
    save_model("weights", w)

``` 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值