对率回归的实验

对数几率回归在python中的实现

在做分类任务时,需要找一个单调可微函数将分类任务的真实标记y与线性回归模型所预测的值联系起来。对数几率函数是用来“替代”单位跃阶函数的,满足单调可微的条件。以下是对数几率函数: y=1/(1+ez) y = 1 / ( 1 + e − z ) ,其中 z=wTx+b z = w T x + b 。对其进行取对数,得到

ln(y/(1y))=wTx+b l n ( y / ( 1 − y ) ) = w T x + b

该公式的解释:将y视为样本x作为正样本的可能性,1-y视为其反列的可能性,对几率取对数得到对数几率。
若将y视为类后验概率估计p(y=1| x),则对数几率可以写为:
ln(p(y=1|x)/p(y=0|x))=wTx+b l n ( p ( y = 1 | x ) / p ( y = 0 | x ) ) = w T x + b

通过极大似然法来估计 w和b。对给定的数据{{ xi x i , yi y i }} mi=1 i = 1 m ,对数回归模型最大化‘对数似然
l(w,b)=i=1mlnp(yi|xi;w,b) l ( w , b ) = ∑ i = 1 m l n p ( y i | x i ; w , b )

改写似然项后可以得到最终公式为
l(β)=i=1m(yiβTxi+ln(1+exp(βTxi))) l ( β ) = ∑ i = 1 m ( − y i β T x i + l n ( 1 + e x p ( β T x i ) ) )

求得最优解 β=argminβl(β) β ∗ = a r g m i n β l ( β )
本文中采用牛顿法:
βt+1=βt(2l(β)ββT)1(l(β)β) β t + 1 = β t − ( ∂ 2 l ( β ) ∂ β ∂ β T ) − 1 ( ∂ l ( β ) ∂ β )

分别求得一阶导数和二阶导数得到:
l(β)β=i=1mxi(yp1(xi;β)) ∂ l ( β ) ∂ β = − ∑ i = 1 m x i ( y − p 1 ( x i ; β ) )

2l(β)ββT=i=1mxixTip1(xi;β)(1p1(xi;β)) ∂ 2 l ( β ) ∂ β ∂ β T = ∑ i = 1 m x i x i T p 1 ( x i ; β ) ( 1 − p 1 ( x i ; β ) )

以上就是对率回归的模型。以下在《机器学习》书中的西瓜数据3.0中实验:

# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd

inputfile = 'xigua3.0.xlsx'

#导入数据
data = pd.read_excel(inputfile, 'Sheet1')
x = np.array([list(data[u'密度']),list(data[u'含糖率']),[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]])
x = x.T
y = np.array([1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0])

#初始化参数
beta = np.array([[0.01],[0.03],[1]])
l_beta = 0
old_l_beta = 0
n = 0
while True:
    #计算l(beta)

    beta_T = np.transpose(beta)
   # print(np.array([x[0,:]]).shape)
    for i in np.arange(len(x)):
        l_beta = l_beta + (-y[i]*np.dot(beta_T, np.array([x[i,:]]).T) +  np.log(1+np.exp(np.dot(beta_T,np.array([x[i,:]]).T))))

    if np.abs(l_beta - old_l_beta).any()<=0.000001:
        break
    #进行迭代
    dbeta = 0
    d2beta = 0
    n = n+1
    old_l_beta = l_beta
    for i in np.arange(len(x)):
        x_i = np.array([x[i,:]])
        x_i_2 = np.dot(x_i,x_i.T)
        exp_b_x = np.exp(np.dot(np.transpose(beta),x_i.T))  

        dbeta = dbeta - np.array([x[i,:]])*( y[i]-( exp_b_x/(1+exp_b_x)))

        d2beta = d2beta + x_i_2*exp_b_x/((1+exp_b_x)*(1+exp_b_x))
    beta = beta - np.dot(np.linalg.inv(d2beta),dbeta).T

    print("迭代次数=>", n)
    print('模型参数=>', beta)
if __name__ == '__main__':
    print(beta)

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值