机器学习3--逻辑回归

一、概述

逻辑回归分析是对定性变量的回归分析,机对变量进行分类预测,如预测是否为垃圾邮件,某人的信用是否为良好等。

二、算法推导

对于线性回归模型,有如下表达方式:
在这里插入图片描述

而对于线性回归预测模型,其取值是连续的,不能够满足作为分类值的需求,如需将预测值全部归并到0和1范围内,需要进行如下逻辑变换,
在这里插入图片描述
即:
在这里插入图片描述
将函数进行归并化简得到如下:
在这里插入图片描述
在进行分类时:
在这里插入图片描述
假设Y是0-1型变量,其损失函数为,可通过似然函数求对数得到:
在这里插入图片描述
在这里插入图片描述
化简可以得到:
在这里插入图片描述
对损失函数进行梯度下降
在这里插入图片描述
在这里插入图片描述

三、算法Python实现

python算法实现如下:

import numpy as np
from sklearn.model_selection import train_test_split

def sigmod(x):
    return 1/(1+np.exp(-x))
def lr(x_train,y_train):
    max_loop = 500000
    threshold = 0.01
    alpha = 0.01
    m,n= x_train.shape
    theta = np.random.rand(n)
    cnt = 0
    while cnt<max_loop:
        diff = np.full(n, 0.0)

        for i in range(m):
            diff+=(y_train[i]-sigmod(theta.T@x_train[i]))*x_train[i]
        print(diff)
        theta = theta+alpha*diff/m

        if (abs(diff)<threshold).all():
            break
        cnt+=1
        print(cnt)
    return theta

def lr_predict(theta,x_test):
    if sigmod(theta.T@x_test)>0.5:
        return 1
    else:
        return 0
if __name__ =="__main__":

    dataset = np.loadtxt('data.txt')
    x_train = dataset[:, 0:-1]
    y_train = dataset[:, -1]
    x0 = np.ones((len(y_train), 1))
    x_train = np.concatenate((x0,x_train),axis=1)


    x_train, x_test, y_train, y_test = train_test_split(x_train, y_train, test_size=0.3)
    theta = lr(x_train, y_train)
    y_pred = []
    for i in range(len(y_test)):
        y_pred.append(lr_predict(theta,x_test[i]))
    print(y_test == y_pred)

输出:

468405
[ 0.00999997  0.00046538 -0.00128062]
[ True  True  True  True  True  True  True  True  True  True  True  True
  True  True  True  True  True  True  True  True False  True  True  True
  True  True  True  True  True  True]

考虑到在使用梯度下降求解的时候采用的是批量梯度下降,运算量较大,为减少运算量,也可使用随机梯度下降法,代码实现如下:

import numpy as np
from sklearn.model_selection import train_test_split

def sigmod(x):
    return 1/(1+np.exp(-x))
def lr(x_train,y_train):
    max_loop = 500000
    threshold = 0.01
    alpha = 0.001
    m,n= x_train.shape
    theta = np.random.rand(n)
    cnt = 0
    while cnt<max_loop:
        diff = np.full(n, 0.0)

        for i in range(m):
            diff=(y_train[i]-sigmod(theta.T@x_train[i]))*x_train[i]

            theta = theta+alpha*diff

        if (abs(diff)<threshold).all():
            break
        cnt+=1
        print(cnt)
    return theta

def lr_predict(theta,x_test):
    if sigmod(theta.T@x_test)>0.5:
        return 1
    else:
        return 0
if __name__ =="__main__":
    dataset = np.loadtxt('data.txt')
    x_train = dataset[:, 0:-1]
    y_train = dataset[:, -1]
    x0 = np.ones((len(y_train), 1))
    x_train = np.concatenate((x0,x_train),axis=1)
    x_train, x_test, y_train, y_test = train_test_split(x_train, y_train, test_size=0.3)
    theta = lr(x_train, y_train)
    y_pred = []
    for i in range(len(y_test)):
        y_pred.append(lr_predict(theta,x_test[i]))
    print(y_test == y_pred)

四、算法Sklearn实现

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
import numpy as np

dataset = np.loadtxt("data.txt")
x_train,x_test,y_train,y_test = train_test_split(dataset[:,0:-1],dataset[:,-1],test_size=0.3)

model = LogisticRegression()
model.fit(x_train,y_train)
print(y_test==model.predict(x_test))

输出:

[ True  True  True False  True  True False  True  True  True  True  True
  True False False  True  True  True  True  True  True  True  True  True
  True  True  True  True  True  True]

在这里插入图片描述

from sklearn.linear_model import SGDClassifier
from sklearn.model_selection import train_test_split
import numpy as np

dataset = np.loadtxt("data.txt")
x_train,x_test,y_train,y_test = train_test_split(dataset[:,0:-1],dataset[:,-1],test_size=0.3)

model = SGDClassifier(alpha=0.001)
model.fit(x_train,y_train)
print(y_test==model.predict(x_test))

输出:

[ True  True  True  True  True  True  True  True False  True False  True
 False  True  True  True False False  True  True  True  True  True  True
  True  True  True  True  True  True]

内容概要:本文详细介绍了基于结构不变补偿的电液伺服系统低阶线性主动干扰抑制控制(ADRC)方法的实现过程。首先定义了电液伺服系统的基本参数,并实现了结构不变补偿(SIC)函数,通过补偿非线性项和干扰,将原始系统转化为一阶积链结构。接着,设计了低阶线性ADRC控制器,包含扩展状态观测器(ESO)和控制律,用于估计系统状态和总干扰,并实现简单有效的控制。文章还展示了系统仿真与对比实验,对比了低阶ADRC与传统PID控制器的性能,证明了ADRC在处理系统非线性和外部干扰方面的优越性。此外,文章深入析了参数调整与稳定性,提出了频域稳定性析和b0参数调整方法,确保系统在参数不确定性下的鲁棒稳定性。最后,文章通过综合实验验证了该方法的有效性,并提供了参数敏感性析和工程实用性指导。 适合人群:具备一定自动化控制基础,特别是对电液伺服系统和主动干扰抑制控制感兴趣的科研人员和工程师。 使用场景及目标:①理解电液伺服系统的建模与控制方法;②掌握低阶线性ADRC的设计原理和实现步骤;③学习如何通过结构不变补偿简化复杂系统的控制设计;④进行系统仿真与实验验证,评估不同控制方法的性能;⑤掌握参数调整与稳定性析技巧,确保控制系统在实际应用中的可靠性和鲁棒性。 阅读建议:本文内容详尽,涉及多个控制理论和技术细节。读者应首先理解电液伺服系统的基本原理和ADRC的核心思想,然后逐步深入学习SIC补偿、ESO设计、控制律实现等内容。同时,结合提供的代码示例进行实践操作,通过调整参数和运行仿真,加深对理论的理解。对于希望进一步探索的读者,可以关注文中提到的高级话题,如频域稳定性析、参数敏感性析等,以提升对系统的全面掌控能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值