个人机器学习笔记之逻辑回归

吴恩达机器学习笔记(2)——Logitic 回归

机器学习个人笔记,学习中水平有限,内容如有缺漏还请多多包涵

Logictic回归是吴恩达课程的第7章,因为线性代数已经学过,而且主攻方向不是Octave,因此跳过了一些章节。目前实现了单,双变量的二分类逻辑回归,多分类的并未着手实现。

单变量,二分类的逻辑回归的python代码实现

import numpy as np
import matplotlib.pyplot as plt

def sigmoid(x):
    return 1/(1+np.exp(-x))

def h(x,pram):#假设函数,这里等价于y=sigmoid(θTX)       
    temp=np.matmul(x,pram[1:].reshape(x.shape[1],1))+pram[0]
    return np.apply_along_axis(sigmoid, 0, temp)

def logictic(a,itertimes,datax,datay):#单变量梯度下降的逻辑回归
    #a:学习率
    #itertimes:迭代次数
    #datax:数据集中的自变量部分
    #datay:数据集中的结果部分
    m=datax.shape[0]#训练集长度
    pram=np.zeros(datax.shape[1]+1)#参数,初始化为0
    temppram=np.zeros(datax.shape[1]+1)#临时存储本次迭代的参数
    for i in range(0,itertimes):#迭代过程,执行itertimes次
        temppram[0]=pram[0]-a*np.sum(h(datax,pram)-datay)#对参数θ0进行迭代 
        te=h(datax,pram)-datay.reshape(m,1)   
        for j in range(1,pram.shape[0]):#对剩余参数进行迭代        
            temppram[j]=pram[j]-a*np.sum((h(datax,pram)-datay.reshape(m,1)).reshape(1,m)*datax[...,j-1])          
        if i%10==0:
            print("迭代",i)
            print( "参数:",pram)
            print("log误差:",np.sum(-datay*np.log(h(datax,pram))-(1-datay)*np.log(1-h(datax,pram))))#每十代输出一次误差
        pram=temppram
        pass
    return pram

x=np.array([range(1,11)]).T
print(x.shape[1])
y=np.array([[1,1,1,0,0,0,0,0,0,0]]).T
print(y.shape)
d=logictic(0.3, 1000, x, y)#执行逻辑回归算法,返回预测参数

drawx=np.array([range(0, 100)]).T
drawx=np.apply_along_axis(lambda x:x/10, 0, drawx)
plt.figure()
plt.scatter(x, y)#绘制数据集的散点图
plt.plot(drawx, h(drawx,d),color='red')#绘制预测值的曲线图
plt.show()

运行结果
单变量逻辑回归

双变量,二分类的逻辑回归的python代码

import numpy as np
import matplotlib.pyplot as plt

def sigmoid(x):
    return 1/(1+np.exp(-x))

def h(x,pram):#假设函数,这里等价于y=sigmoid(θTX)         
    temp=np.matmul(x,pram[1:].reshape(x.shape[1],1))+pram[0]
    return np.apply_along_axis(sigmoid, 0, temp)

def logictic(a,itertimes,datax,datay):#逻辑回归
    #a:学习率
    #itertimes:迭代次数
    #datax:数据集中的自变量部分
    #datay:数据集中的结果部分
    m=datax.shape[0]#训练集长度
    pram=np.zeros(datax.shape[1]+1)#参数,初始化为0
    temppram=np.zeros(datax.shape[1]+1)#临时存储本次迭代的参数
    for i in range(0,itertimes):#迭代过程,执行itertimes次
        temppram[0]=pram[0]-a*np.sum(h(datax,pram)-datay)#对参数theta0进行迭代 
        te=h(datax,pram)-datay
        for j in range(1,pram.shape[0]):#对剩余参数进行迭代        
            temppram[j]=pram[j]-a*np.sum((h(datax,pram)-datay).T*datax[...,j-1])          
        if i%10==0:
            print("迭代",i)
            print( "参数:",pram)                       
            print("log误差:",np.sum(-datay*np.log(h(datax,pram))-(1-datay)*np.log(1-h(datax,pram))))#每十代输出误差
        pram=temppram
        pass
    return pram

x=np.zeros([100,2])#在10*10的样本空间中做逻辑回归
for i in range(0,10):    
    for j in range(0,10):       
        x[i*10+j][0]=i
        x[i*10+j][1]=j
print(x.shape[1])

y=np.zeros([100,1])
for i in range(0,10):    
    for j in range(0,10):       
        if i+j-9>0:#数据集分类边界取直线y=-x+9
            y[i*10+j][0]=1

print(y.shape)
d=logictic(0.01, 500, x, y)#执行逻辑回归算法,返回分类边界线的参数

drawx=[]#设置用于绘图的坐标集合
drawy=[]
drawx1=[]
drawy1=[]
for i in range(0,100):
    if y[i]==1:#如果y中的第i个元素是1,则取出x中第i个样本作为坐标放入drawx列表
        drawx.append(x[i][0])
        drawy.append(x[i][1])
    else:#如果y中的第i个元素是0,则取出x中第i个样本作为坐标放入drawx1列表
        drawx1.append(x[i][0])
        drawy1.append(x[i][1])
plt.figure()
plt.scatter(drawx, drawy)#分别绘制数据集中drawx,drawx1两个分类的散点图
plt.scatter(drawx1, drawy1)
plt.plot(range(0,10), np.array(range(0,10))*-d[1]/d[2]-d[0]/d[2],color='red')#绘制分类线的图
plt.ylabel("var1")#注意不能设label为中文
plt.xlabel("var2")
plt.show()

双变量逻辑回归

实现过程记录

双变量逻辑回归的学习率要设置的比单变量时要低些,不然虽然可以计算出分类边界线的参数但计算log误差时会出现NAN值。
matplotlib设置图像的label为中文会出现乱码

公式部分

为了能在逻辑回归中继续使用梯度下降,我们定义了新的损失函数。
逻辑回归的损失函数定义为:
J ( θ ) = 1 m ∑ i = 0 m C o s t ( h θ ( x ( i ) ) − y ( i ) ) . J(\theta) =\frac{1}{m}\sum_{i=0}^m Cost(h_{\theta}(x^{(i)})-y^{(i)}). J(θ)=m1i=0mCost(hθ(x(i))y(i)).
其中,Cost()函数部分定义为:
C o s t ( h θ ( x ( i ) ) − y ( i ) ) = − [ y ( i ) l o g h θ ( x ( i ) ) + ( 1 − y ( i ) ) l o g ( 1 − h θ ( x ( i ) ) ) ] . Cost(h_{\theta}(x^{(i)})-y^{(i)})= -[y^{(i)} log h_{\theta}(x^{(i)})+(1-y^{(i)})log(1-h_{\theta}(x^{(i)}))]. Cost(hθ(x(i))y(i))=[y(i)loghθ(x(i))+(1y(i))log(1hθ(x(i)))].
假设函数的新定义为:
h θ ( X ) = 1 1 + e − θ T X . h_\theta(X)=\frac{1}{1+e^{-\theta^{T}X}}. hθ(X)=1+eθTX1.
个人认为引入sigmoid函数是为了加入分类所需的非线性特征
使用梯度下降的逻辑回归的迭代公式:

θ 0 = θ 0 − a ∗ ∑ i = 0 m ( h θ ( x ( i ) ) − y ( i ) ) . \theta_0 =\theta_0- a*\sum_{i=0}^m (h_{\theta}(x^{(i)})-y^{(i)}). θ0=θ0ai=0m(hθ(x(i))y(i)).
θ j = θ j − a ∗ ∑ i = 0 m ( h θ ( x ( i ) ) − y ( i ) ) ∗ x i . \theta_j =\theta_j- a*\sum_{i=0}^m (h_{\theta}(x^{(i)})-y^{(i)})*x^{i}. θj=θjai=0m(hθ(x(i))y(i))xi.

学习视频:

逻辑回归.

其他笔记

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习中的二分类逻辑回归是一种用于解决二分类问题的算法。它的基本思路是通过构建一个逻辑回归模型,将输入的特征映射到一个概率值,然后根据这个概率值进行分类。 逻辑回归使用sigmoid函数来处理hθ(x),这是因为sigmoid函数的取值范围在0到1之间,可以将线性回归的输出转化为一个概率值。通过sigmoid函数处理后,我们可以将概率值大于等于0.5的样本划分为正类,概率值小于0.5的样本划分为负类。这使得逻辑回归可以用于二分类问题。 代价函数的推导和偏导数的推导是为了求解逻辑回归模型中的参数θ。通过最小化代价函数,我们可以得到最优的参数θ,使得模型的预测结果与真实标签最接近。 在正则化逻辑回归中,我们引入正则化项的目的是为了避免过拟合。正则化项可以惩罚模型中的参数,使得参数的值趋向于较小的数值,从而降低模型的复杂度。在正则化逻辑回归中,一般不对θ1进行正则化,这是因为θ1对应的是截距项,它影响模型在原点的位置,不参与特征的权重调整。 综上所述,机器学习中的二分类逻辑回归是一种通过构建逻辑回归模型,利用sigmoid函数将线性回归的输出转化为概率值,并通过最小化代价函数求解参数θ的算法。正则化逻辑回归则是在逻辑回归的基础上引入正则化项,避免过拟合问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [吴恩达机器学习逻辑回归(二分类)](https://blog.csdn.net/q642634743/article/details/118831665)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [机器学习笔记——逻辑回归之二分类](https://blog.csdn.net/dzc_go/article/details/108855689)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值