IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 如何求解逻辑函数的损失函数,及代码实现? -> 正文阅读

[数据结构与算法]如何求解逻辑函数的损失函数,及代码实现?

前言:本文使用的损失函数为KL离散构建的损失函数,无公式推导部分;代码部分为自定义函数,非sklearn。

逻辑回归KL离散构建的损失函数为:?

\bg_white binaryCE(\hat{w})=-\frac{1}{m}\sum_{i=1}^m[y^{(i)}\cdot log(p_1(\hat{x}^{(i)};\hat{w}))+(1-y^{(i)})\cdot log(1-p_i(\hat{x}^{(i)};\hat{w}))]?

其中m表示样本数量;p_1表示标签为1的概率;y^{(i)}表示第i条样本的真实值;x^{(i)}表示第i条样本数据(包含多个特征,即一行数据;最后一个值为1)。?


损失函数求导(梯度表达式)为:?

\begin{aligned} \nabla_{\hat{w}}BCE(\hat{w})&=\frac{\partial{BCE(\hat{w})}}{\partial{\hat{w}}}\\ &=\frac{1}{m}\hat{X}^T(Sigmoid(\hat{X}\cdot{\hat{w}})-y) \end{aligned}?


公式推导思路:

  1. BCE可以拆解为对y^{(i)}\cdot log(p_1(\hat{x}^{(i)};\hat{w}))(1-y^{(i)})\cdot log(1-p_i(\hat{x}^{(i)};\hat{w}))分别对w、b求导;
  2. 将上述结果带入\frac{\partial{BCE(\hat{w})}}{\partial{w}_i}\frac{\partial{BCE(\hat{w})}}{\partial{b}}

逻辑回归自定义函数

def logit_gd(X,w,y):
    """
    返回逻辑回归梯度下降的结果
    """
    m=X.shape[0]
    return (X.T.dot(sigmoid(X.dot(w))-y))/m

如何使用自定义逻辑回归函数做预测模型?(案例:标签分类)

思路:

????????1. 创建自定义数据集

? ? ? ? 2. 用逻辑回归预测标签,画出学习曲线进行模型评估


1. 创建自定义数据集,此处使用自定义函数创建自定义数据集?。

def arrayGenCla(num_examples=1000,num_inputs=2,num_class=3,deg_dispersion=[4,2],bias=False):
    mean_=deg_dispersion[0]  # 设定数据均值
    std_=deg_dispersion[1]   # 设定数据方差
    k=mean_*(num_class-1)/2   # 设定惩罚因子,将数据调整为围绕原点分布
    cluster_l=np.empty([num_examples,1])
    lf=[]
    ll=[]
    
    for i in range(num_class):   # 创建各个分类的数据
        data_temp=np.random.normal(i*mean_-k,std_,size=(num_examples,num_inputs))
        lf.append(data_temp)
        labels_temp=np.full_like(cluster_l,i)
        ll.append(labels_temp)
    
    features=np.concatenate(lf) # 把分类的数据合并
    labels=np.concatenate(ll)
    
    if bias== True: # 如果设定的数据集为多元,则features最后一列加“1”
        features=np.concatenate((features,np.ones(labels.shape)),1)
    
    return features,labels

?2. 用逻辑回归预测标签,画出学习曲线进行模型评估

首先,使用自定义函数创建一个数据集。该数据集有两个标签,重叠部分较少。?

np.random.seed(9)
f,l=arrayGenCla(num_class=2,deg_dispersion=[6,2],bias=True)
plt.scatter(f[:,0],f[:,1],c=l)
plt.show()

然后,切分数据集为训练集和测试集。使用梯度下降求解参数w,保存每次w迭代后的结果,求出在训练集和测试集的模型表现,画出学习曲线。

代码中部分为自定义函数,补充在学习曲线后面。

X_train,X_test,y_train,y_test=array_split(f,l,random_state=9)

X_train[:,:-1]=z_score(X_train[:,:-1])
X_test[:,:-1]=z_score(X_test[:,:-1])

np.random.seed(24)
w=np.random.randn(f.shape[1],1)

score_train=[]
score_test=[]
for i in range(num_epoch):
    w=sgd_cal(X_train,w,y_train
              ,logit_gd
              ,batch_size=batch_size
              ,epoch=1
              ,lr=lr_init*lr_lambda(i))
    score_train.append(logit_acc(X_train,w,y_train,thr=0.5))
    score_test.append((logit_acc(X_test,w,y_test,thr=0.5)))

plt.plot(range(num_epoch),score_train,label='score_train')
plt.plot(range(num_epoch),score_test,label='score_test')
plt.legend()
plt.show()

def logit_cla(yhat, thr=0.5):
    """
    返回逻辑回归类别输出函数
    """
    ycla = np.zeros_like(yhat)
    ycla[yhat >= thr] = 1
    return ycla

def logit_acc(X,w,y,thr=0.5):
		"""
		返回逻辑回归的评估指标
		"""
    y_hat=sigmoid(X.dot(w))
    y_cal=logit_cla(y_hat,thr=thr)
    return(y_cal==y).mean()

结论:由学习曲线可知,迭代大概25次后,参数w已经接近最优解,模型趋于稳定。模型设定考虑的因素比较简单,w在测试集上表现更好为偶然。


如果数据重叠较多,那么这个逻辑回归模型的表现会怎么样呢?下面再次进行实验:

# 重合程度较大的数据集上逻辑回归的表现结果

np.random.seed(9)
f_1,l_1=arrayGenCla(num_class=2,deg_dispersion=[6,4],bias=True)
plt.scatter(f_1[:,0],f_1[:,1],c=l)
plt.show()

X_train,X_test,y_train,y_test=array_split(f_1,l_1,random_state=9)

X_train[:,:-1]=z_score(X_train[:,:-1])
X_test[:,:-1]=z_score(X_test[:,:-1])

np.random.seed(24)
w=np.random.randn(f.shape[1],1)

score_train=[]
score_test=[]
for i in range(num_epoch):
    w=sgd_cal(X_train,w,y_train
              ,logit_gd
              ,batch_size=batch_size
              ,epoch=1
              ,lr=lr_init*lr_lambda(i)
             )
    score_train.append(logit_acc(X_train,w,y_train,thr=0.5))
    score_test.append((logit_acc(X_test,w,y_test,thr=0.5)))

plt.plot(range(num_epoch),score_train,label='score_train')
plt.plot(range(num_epoch),score_test,label='score_test')
plt.legend()
plt.show()


结论:由学习曲线可知,同样在迭代25次后,模型趋于平稳,准确率下降到了0.85左右。?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-10 12:39:06  更:2021-11-10 12:41:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:47:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码