吴恩达《机器学习》学习笔记八——逻辑回归(多分类)代码

吴恩达《机器学习》笔记八——逻辑回归(多分类)代码

  • 导入模块及加载数据
  • sigmoid函数与假设函数
  • 代价函数
  • 梯度下降
  • 一对多分类
  • 预测验证

课程链接:https://www.bilibili.com/video/BV164411b7dx?from=search&seid=5329376196520099118

之前笔记七里介绍了二分类问题的逻辑回归代码,涉及到了线性与非线性假设,是否使用正则化等问题,这次做一个推广,用逻辑回归来解决一个多分类问题,手写数字识别,这个问题如今更多在深度学习里使用神经网络来解决。

本次笔记用到的数据集:
链接:https://pan.baidu.com/s/1_HvmGeQfzv4bc7zBTvyEXw
提取码:rdks

导入模块及加载数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.io import loadmat

数据集是在MATLAB的本机格式,所以要加载它到Python,需要使用一个SciPy工具。

data = loadmat('ex3data1.mat')
data

在这里插入图片描述
看一下数据的维度:

data['X'].shape, data['y'].shape

在这里插入图片描述
图像在martix X中表示为400维向量(其中有5,000个)。 400维“特征”是原始20 x 20图像中每个像素的灰度强度。类标签在向量y中作为表示图像中数字的数字类。

第一个任务是将我们的逻辑回归实现修改为完全向量化(即没有“for”循环)。这是因为向量化代码除了简洁外,还能够利用线性代数优化,并且通常比迭代代码快得多

sigmoid函数与假设函数

g 代表一个常用的逻辑函数(logistic function)为S形函数(Sigmoid function),公式为:
在这里插入图片描述
逻辑回归模型的假设函数:
在这里插入图片描述

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

代价函数

在这里插入图片描述

def cost(theta, X, y, learningRate):# INPUT:参数值theta,数据X,标签y,学习率# OUTPUT:当前参数值下的交叉熵损失# TODO:根据参数和输入的数据计算交叉熵损失函数# STEP1:将theta, X, y转换为numpy类型的矩阵theta =np.matrix(theta)X = np.matrix(X)y = np.matrix(y)# STEP2:根据公式计算损失函数(不含正则化)cross_cost =np.multiply(-y, np.log(sigmoid(X * theta.T)))-np.multiply((1 - y), np.log(1 - sigmoid(X * theta.T)))# STEP3:根据公式计算损失函数中的正则化部分reg =  (learningRate / (2 * len(X))) * np.sum(np.power(theta[:,1:theta.shape[1]], 2))# STEP4:把上两步当中的结果加起来得到整体损失函数whole_cost=np.sum(cross_cost)/len(X)+regreturn whole_cost

梯度下降

如果我们要使用梯度下降法令这个代价函数最小化,因为我们未对 θ0 进行正则化,所以梯度下降算法将分两种情形:
在这里插入图片描述

def gradient(theta, X, y, learningRate):# INPUT:参数值theta,数据X,标签y,学习率# OUTPUT:当前参数值下的梯度# TODO:根据参数和输入的数据计算梯度# STEP1:将theta, X, y转换为numpy类型的矩阵theta = np.matrix(theta)X = np.matrix(X)y = np.matrix(y)# STEP2:将theta矩阵拉直(转换为一个向量)parameters =int(theta.ravel().shape[1])# STEP3:计算预测的误差  error = sigmoid(X * theta.T) - y# STEP4:根据上面的公式计算梯度grad = ((X.T * error) / len(X)).T + ((learningRate / len(X)) * theta)# STEP5:由于j=0时不需要正则化,所以这里重置一下grad[0, 0] = np.sum(np.multiply(error, X[:,0])) / len(X)return np.array(grad).ravel()

一对多分类

现在已经定义了代价函数和梯度函数,是构建分类器的时候了。 对于这个任务,我们有10个可能的类,并且由于逻辑回归只能一次在2个类之间进行分类,我们需要多类分类的策略。 在本练习中,任务是实现一对一全分类方法,其中具有k个不同类的标签就有k个分类器,每个分类器在“类别 i”和“不是 i”之间决定。 我们将把分类器训练包含在一个函数中,该函数计算10个分类器中的每个分类器的最终权重,并将权重返回为k ×(n + 1)数组,其中n是参数数量。

from scipy.optimize import minimizedef one_vs_all(X, y, num_labels, learning_rate):rows = X.shape[0]params = X.shape[1]# k X (n + 1) array for the parameters of each of the k classifiersall_theta = np.zeros((num_labels, params + 1))# insert a column of ones at the beginning for the intercept termX = np.insert(X, 0, values=np.ones(rows), axis=1)# labels are 1-indexed instead of 0-indexedfor i in range(1, num_labels + 1):theta = np.zeros(params + 1)y_i = np.array([1 if label == i else 0 for label in y])y_i = np.reshape(y_i, (rows, 1))# minimize the objective functionfmin = minimize(fun=cost, x0=theta, args=(X, y_i, learning_rate), method='TNC', jac=gradient)all_theta[i-1,:] = fmin.xreturn all_theta

这里需要注意的几点:首先,我们为theta添加了一个额外的参数(与训练数据一列),以计算截距项(常数项)。 其次,我们将y从类标签转换为每个分类器的二进制值(要么是类i,要么不是类i)。 最后,我们使用SciPy的较新优化API来最小化每个分类器的代价函数。 如果指定的话,API将采用目标函数,初始参数集,优化方法和jacobian(渐变)函数。 然后将优化程序找到的参数分配给参数数组。

实现向量化代码的一个更具挑战性的部分是正确地写入所有的矩阵,保证维度正确。

rows = data['X'].shape[0]
params = data['X'].shape[1]all_theta = np.zeros((10, params + 1))X = np.insert(data['X'], 0, values=np.ones(rows), axis=1)theta = np.zeros(params + 1)y_0 = np.array([1 if label == 0 else 0 for label in data['y']])
y_0 = np.reshape(y_0, (rows, 1))X.shape, y_0.shape, theta.shape, all_theta.shape

在这里插入图片描述
注意,theta是一维数组,因此当它被转换为计算梯度的代码中的矩阵时,它变为(1×401)矩阵。 我们还检查y中的类标签,以确保它们看起来像我们想象的一致。

np.unique(data['y'])#看下有几类标签

在这里插入图片描述
让我们确保我们的训练函数正确运行,并且得到合理的输出。

all_theta = one_vs_all(data['X'], data['y'], 10, 1)
all_theta

在这里插入图片描述

预测验证

我们现在准备好最后一步 - 使用训练完毕的分类器预测每个图像的标签。 对于这一步,我们将计算每个类的类概率,对于每个训练样本(使用当然的向量化代码),并将输出类标签为具有最高概率的类。

Tip:可以使用np.argmax()函数找到矩阵中指定维度的最大值。

def predict_all(X, all_theta):# INPUT:参数值theta,测试数据X# OUTPUT:预测值# TODO:对测试数据进行预测# STEP1:获取矩阵的维度信息rows = X.shape[0]params = X.shape[1]num_labels = all_theta.shape[0]# STEP2:把矩阵X加入一行零元素X = np.insert(X, 0, values=np.ones(rows), axis=1)# STEP3:把矩阵X和all_theta转换为numpy型矩阵X = np.matrix(X)all_theta = np.matrix(all_theta)# STEP4:计算样本属于每一类的概率h = sigmoid(X * all_theta.T)# STEP5:找到每个样本中预测概率最大的值h_argmax = np.argmax(h, axis=1)# STEP6:因为我们的数组是零索引的,所以我们需要为真正的标签+1h_argmax = h_argmax + 1return h_argmax

现在我们可以使用predict_all函数为每个实例生成类预测,看看我们的分类器是如何工作的。

y_pred = predict_all(data['X'], all_theta)
correct = [1 if a == b else 0 for (a, b) in zip(y_pred, data['y'])]
accuracy = (sum(map(int, correct)) / float(len(correct)))
print ('accuracy = {0}%'.format(accuracy * 100))

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491751.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DeepMind 综述深度强化学习:智能体和人类相似度竟然如此高!

来源:AI科技评论近年来,深度强化学习(Deep reinforcement learning)方法在人工智能方面取得了瞩目的成就,从 Atari 游戏、到围棋、再到无限制扑克等领域,AI 的表现都大大超越了专业选手,这一进展…

Python随机选择一部分训练样本作为测试样本

假设训练样本有30个,从训练样本中随机获得10个作为测试样本,剩下20个继续作为训练样本 import numpy as nptrainingSet list(range(30)) # 训练样本下标 testSet [] for i in range(10):randIndex int(np.random.uniform(0, len(training…

吴恩达《机器学习》学习笔记十——神经网络相关(2)

吴恩达《机器学习》学习笔记十——神经网络相关(2)一、 代价函数二、 反向传播算法三、 理解反向传播算法四、 梯度检测五、 随机初始化1.全部初始化为0的问题2.随机初始化的思想六、 神经网络算法整体流程1.选择网络具体架构2.训练神经网络课程链接&…

Ajax跨域请求解决方案——jsonp

转自:http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html 1、一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访问的问题,甭管你是静态页面、动态网页、web服务、WCF,只要是跨域请求&#xff0…

MATLAB的Kmeans函数实现聚类

转自https://blog.csdn.net/a493823882/article/details/79282425 使用方法: Idxkmeans(X,K) [Idx,C]kmeans(X,K) [Idx,C,sumD]kmeans(X,K) [Idx,C,sumD,D]kmeans(X,K) […]Kmeans(…,’Param1’,Val1,’Param2’,Val2,…)各输入…

吴恩达《机器学习》学习笔记十一——神经网络代码

吴恩达《机器学习》学习笔记十一——神经网络代码数据准备神经网络结构与代价函数初始化设置反向传播算法训练网络与验证课程链接:https://www.bilibili.com/video/BV164411b7dx?fromsearch&seid5329376196520099118 数据集链接:https://pan.baidu…

中国科研人员发明单晶体管逻辑结构新原理

▲随着晶体管不断缩小特征尺寸,集成电路的性能得以持续提升。然而在超小器件尺寸下,硅材料的物理极限导致了功耗的大幅提升,难以进一步持续减小晶体管的特征尺寸。来源:文汇网通过引入层状半导体,并依据其特性设计新型…

Java 内存模型

1、并发模型编程的分类 在并发模型编程中,我们需要解决两个关键问题:线程之间如何通信以及线程之间如何同步。线程之间的通信包括两种:共享内存和消息传递。 Java并发采用的是共享内存模型。 2、Java内存模型的抽象 Java内存模型的主要目标是…

神经网络中Batch和Epoch之间的区别

来自蜂口知道公众号 随机梯度下降法是一种具有大量超参数的学习算法。通常会使初学者感到困惑的两个超参数: Batch大小和Epoch数量,它们都是整数值,看起来做的事情是一样的。在这篇文章中,您将发现随机梯度下降中Batch和Epoch之间的差异。 阅读这篇文章…

PyTorch框架学习一——PyTorch的安装(CPU版本)

PyTorch框架学习一——PyTorch的安装(CPU版本)PyTorch简介PyTorch的安装(CPU版)机器学习/深度学习领域的学习都是需要理论和实践相结合的,而它们的实践都需要借助于一个框架来实现,PyTorch在学术界目前处于…

你的大脑在自动驾驶,而你一无所知

来源:果壳想象一下,你的大脑里有着两个小人,它们在不停地打架,试图夺取控制你行动的权力。当然,这两个小人并不是你善意和邪恶的念头。那它们是什么?在很多人看来,这两者就是我们的意识和无意识…

常用的损失函数

来自 机器学习成长之路公众号 本文将常用的损失函数分为了两大类:分类和回归。然后又分别对这两类进行了细分和讲解,其中回归中包含了一种不太常见的损失函数:平均偏差误差,可以用来确定模型中存在正偏差还是负偏差。 从学习任务…

吴恩达《机器学习》学习笔记十一——应用机器学习的建议

吴恩达《机器学习》学习笔记十一——应用机器学习的建议一、训练完模型后下一步要做什么二、评估算法与模型选择1.训练集与测试集2.训练/测试步骤3.模型选择4.数据集新的划分——验证集的加入三、偏差与方差1.偏差与方差的理解2.正则化和偏差方差的关系3.学习曲线四、决定接下来…

为什么说深耕AI领域绕不开知识图谱?

来源:AI科技大本营“所有在 AI 领域深耕的人,最终都会发现语义鸿沟仍是一个非常具有挑战性的问题,这最终还需要借助知识图谱等技术,来帮助将整体的 AI 认知取得新进展。”在 5 月 26 日的 CTA 峰会机器学习专场,Hulu 首…

Ruby 变量

Ruby 之初体验。接着学习,昨天竟然病了,懈怠了。要坚持锻炼丫,就和坚持写博客似的。 来,下面接着唠。 来侃侃变量,百度上说是能储存计算结果或能表示值抽象概念。顾名思义就是可变化的值。 Ruby 支持五种类型的变量。 …

机器学习中的相似性度量总结

来自 机器学习算法那些事公众号 在做分类时常常需要估算不同样本之间的相似性度量(Similarity Measurement),这时通常采用的方法就是计算样本间的“距离”(Distance)。采用什么样的方法计算距离是很讲究,甚至关系到分类的正确与否。 目录 1. 欧氏距离 …

吴恩达《机器学习》学习笔记十二——机器学习系统

吴恩达《机器学习》学习笔记十二——机器学习系统一、设计机器学习系统的思想1.快速实现绘制学习曲线——寻找重点优化的方向2.误差分析3.数值估计二、偏斜类问题(类别不均衡)三、查准率P与召回率R——代替准确率的评估指标四、查准率与召回率的权衡——…

增强现实:一场正在到来的医疗革命

来源: 资本实验室图像化可以让医生的诊断、决策和治疗更加准确,可以说是医疗史上非常重要的一项技术突破。近几年,通讯技术的发展推动了空间计算的快速商业化。在医疗领域,增强现实(AR)、虚拟现实&#xff…

android user版本默认开启调试模式

由于项目需要,需要发布版本默认开启调试模式,修改方式如下: 1.开启开发者模式 context.getSharedPreferences(DevelopmentSettings.PREF_FILE,Context.MODE_PRIVATE).edit().putBoolean( DevelopmentSettings.PREF_SHOW, true).apply(); 2.勾…

吴恩达《机器学习》学习笔记十三——机器学习系统(补充)

这次笔记是对笔记十二的补充,之前讨论了评价指标,这次主要是补充机器学习系统设计中另一个重要的方面,用来训练的数据有多少的问题。 笔记十二地址:https://blog.csdn.net/qq_40467656/article/details/107602209 之前曾说过不要…