机器学习(3)--逻辑回归Python实现(附练习数据资源百度云)

上一篇:机器学习(3)--LR算法https://blog.csdn.net/qq_36187544/article/details/87893025

下一篇:机器学习(3)--正则化及python源码(附练习数据资源文件百度云)https://blog.csdn.net/qq_36187544/article/details/88060700


分享数据资源txt文件与源码PY:

链接:https://pan.baidu.com/s/1VjSWbFpeo-ULcQ-wyhOljQ 
提取码:ucdi 

主要文件如下图,py文件是源码,xls表格文件是网上开源的信用卡数据集,为了方便解析摘取了部分数据放入txt中作为训练集

写完了之后利用xls文件其余数据取了几行做了一下测试。

运行结果如下,与测试结果一致,当然不是所有数据都满足此结果,这应当是一个概率问题:

源代码如下,因为对原数据做了归一处理,所以测试数据时也应当减去平均值再除以标准差即对测试数据做归一化。此用例计算时间较长,注意把控,可调整lr函数中循环次数,但循环次数过低则可能导致假设函数不够贴切:

import numpy as np

'''逻辑回归'''
# Hθ
def getH(θ, _x):
    θx = θ[0]
    for i in range(len(_x)):
        θx += θ[i+1]*_x[i]
    if θx >= 0:
        return 1.0 / (1 + np.exp(-θx))
    else:
        return np.exp(θx) / (1 + np.exp(θx))
    # return 1/(1+np.exp(-θx))  #这样直接返回结果会导致RuntimeWarning: overflow encountered in exp


def lr(x,y, α):
    θ = [0]
    for i in range(len(x)):
        θ.append(0)

    m=len(x[0])
    for ii in range(100):
        sum = 0
        for j in range(m):
            _x = []
            for jj in range(len(x)):
                _x.append(x[jj][m-1])
            sum+=(getH(θ,_x)-y[j])
        θ[0] -= α*sum/m
        for i in range(len(x)):
            sum = 0
            for j in range(m):
                _x = []
                for jj in range(len(x)):
                    _x.append(x[jj][m-1])
                sum += ((getH(θ, _x) - y[j])*x[i][j])
            θ[i] -= α * sum/m
    return θ


x, y = [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]],[]
for sample in open("credit_card_clients.txt", "r"):
    aaa,_x1, _x2, _x3, _x4, _x5, _x6,  _x7, _x8, _x9, _x10, _x11, _x12,_x13,_x14,_x15,_x16,_x17,_x18,_x19,_x20,_x21,_x22,_x23,_y = sample.split("	")
    x[0].append(int(_x1))
    x[1].append(int(_x2))
    x[2].append(int(_x3))
    x[3].append(int(_x4))
    x[4].append(int(_x5))
    x[5].append(int(_x6))
    x[6].append(int(_x7))
    x[7].append(int(_x8))
    x[8].append(int(_x9))
    x[9].append(int(_x10))
    x[10].append(int(_x11))
    x[11].append(int(_x12))
    x[12].append(int(_x13))
    x[13].append(int(_x14))
    x[14].append(int(_x15))
    x[15].append(int(_x16))
    x[16].append(int(_x17))
    x[17].append(int(_x18))
    x[18].append(int(_x19))
    x[19].append(int(_x20))
    x[20].append(int(_x21))
    x[21].append(int(_x22))
    x[22].append(int(_x23))
    y.append(int(_y))

x[0], x[1], x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10],x[11],x[12],x[13],x[14],x[15],x[16],x[17],x[18],x[19],x[20],x[21],x[22],y = np.array(x[0]), np.array(x[1]), np.array(x[2]), np.array(x[3]), np.array(x[4]), np.array(x[5]), np.array(x[6]), np.array(x[7]), np.array(x[8]), np.array(x[9]), np.array(x[10]),  np.array(x[11]), np.array(x[12]), np.array(x[13]), np.array(x[14]), np.array(x[15]), np.array(x[16]), np.array(x[17]), np.array(x[18]), np.array(x[19]), np.array(x[20]), np.array(x[21]), np.array(x[22]),np.array(y) # 转化为Numpy数组待处理
# 记录下标准值供测试使用
mean ,std= [],[]
for i in range(len(x)):
    mean.append(x[i].mean())
    std.append(x[i].std())
x[0] = (x[0] - x[0].mean()) / x[0].std()  # 标准化,Mean表示取均值,std()为标准差,var()是方差
x[1] = (x[1] - x[1].mean()) / x[1].std()
x[2] = (x[2] - x[2].mean()) / x[2].std()
x[3] = (x[3] - x[3].mean()) / x[3].std()
x[4] = (x[4] - x[4].mean()) / x[4].std()
x[5] = (x[5] - x[5].mean()) / x[5].std()
x[6] = (x[6] - x[6].mean()) / x[6].std()
x[7] = (x[7] - x[7].mean()) / x[7].std()
x[8] = (x[8] - x[8].mean()) / x[8].std()
x[9] = (x[9] - x[9].mean()) / x[9].std()
x[10] = (x[10] - x[10].mean()) / x[10].std()
x[11] = (x[11] - x[11].mean()) / x[11].std()
x[12] = (x[12] - x[12].mean()) / x[12].std()
x[13] = (x[13] - x[13].mean()) / x[13].std()
x[14] = (x[14] - x[14].mean()) / x[14].std()
x[15] = (x[15] - x[15].mean()) / x[15].std()
x[16] = (x[16] - x[16].mean()) / x[16].std()
x[17] = (x[17] - x[17].mean()) / x[17].std()
x[18] = (x[18] - x[18].mean()) / x[18].std()
x[19] = (x[19] - x[19].mean()) / x[19].std()
x[20] = (x[20] - x[20].mean()) / x[20].std()
x[21] = (x[21] - x[21].mean()) / x[21].std()
x[22] = (x[22] - x[22].mean()) / x[22].std()
θ=[1.0838212187817922, -0.045955968961057296, 0.2900506418097455, -0.3127799856789351, 0.137783064865873, 2.4100461504016066, 1.7189506195292905, 1.582471758324859, 1.4126993687049045, 1.3885654177918474, 1.119129407787314, -0.060791017217695656, -0.05068254473086228, -0.037071324667241855, 0.0264489989904585, -0.005852121886165663, 0.014332012489780702, -0.7075552647477504, -0.6615940786053858, -0.2321243465015359, -0.5072334204862982, -0.27004565251264956, -0.34783918371064676, 0]

# lr(x,y,0.2)
print(θ)

def test(θ , test):
    sum = θ[0]
    for i in range(1, len(θ)):
        sum += θ[i]*(test[i-1]-mean[i-1])/std[i-1]
    if sum>0:print(str(sum)+"结果是:1")
    else:print(str(sum)+"结果是:0")

# 找了另外的两行数据测试
test1=[220000,1,1,2,26,0,0,0,0,0,0,44432,128967,96750,71616,65415,57914,100000,18720,37800,7096,12000,25000]
test(θ , test1) # 测试结果应该是0
test2=[50000,2,	2,	1	,44,2,2,2,0,0,0,26587,29730,28565,26601,26391,27165,3600,0,1500,1000,1200,1200]
test(θ , test2) # 测试结果应该是1

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值