Machine Learning-Ex3(吴恩达课后习题)Multi-class Classification and Neural Networks

news2025/1/15 22:44:14

目录

1. Multi-class Classification

1.1 Dataset

1.2 Visualizing the data

1.3 Vectorizing Logistic Regression

1.3.1 Vectorizing the cost function(no regularization)

1.3.2 Vectorizing the gradient(no regularization)

1.3.3 Vectorizing regularized logistic regression​

1.4 One-vs-all Classification

1.4.1 One-vs-all Prediction 

2. Neural Networks

2.1 Model representation

2.2 Feedforward Propagation and Prediction​


1. Multi-class Classification

1.1 Dataset

内容:5000个20*20像素的手写字体图像与它对应的数字,其中数字0的值用10表示。

main.py

# scipy.io模块提供了很多函数来处理Matlab的数组
from scipy.io import loadmat  # loadmat方法可以导入Matlab格式数据

data = loadmat('ex3data1.mat')
print(data)
print(data['X'].shape, data['y'].shape)  # (5000, 400) (5000, 1)

{'__header__': b'MATLAB 5.0 MAT-file, Platform: GLNXA64, Created on: Sun Oct 16 13:09:09 2011', '__version__': '1.0', '__globals__': [], 'X': array([[0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       ...,
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.]]), 'y': array([[10],
       [10],
       [10],
       ...,
       [ 9],
       [ 9],
       [ 9]], dtype=uint8)}
(5000, 400) (5000, 1)

1.2 Visualizing the data

内容:随机展示100个数据。

main.py

# scipy.io模块提供了很多函数来处理Matlab的数组
from scipy.io import loadmat  # loadmat方法可以导入Matlab格式数据
import numpy as np

data = loadmat('ex3data1.mat')
# np.random.choice(a,size=None,replace=True,p=None)
# 1.从a(必须是一维)中随机取数字,组成大小为size的数组;replace-True表示可以取相同数字;p-a中每个元素被取的概率,默认为每个元素概率相同
# np.arange(start,stop,step)用于生成数组-开始位置,停止位置,步长,即在给定间隔内返回均匀间隔的值
# print(np.arange(data['X'].shape[0]))  # [   0    1    2 ... 4997 4998 4999]
sample_index = np.random.choice(np.arange(data['X'].shape[0]), 100)  # 从0-4999中随机抽取100个数作为下标
sample_images = data['X'][sample_index, :]  # 抽取下标为sample_index的这些X的数据行
print(sample_images)

[[0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 ...
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]]

plot_training_set.py

import numpy as np
import matplotlib.pyplot as plt
import matplotlib  # 使用matplotlib.cm色表

def plotTrainingSet(data):
    sample_index = np.random.choice(np.arange(data['X'].shape[0]), 100)  # 从0-4999中随机抽取100个数作为下标
    sample_images = data['X'][sample_index, :]  # 抽取下标为sample_index的这些X的数据行 (100*400)
    # subplots(nrows,ncols,sharex,sharey)-子图的行列数,sharex/sharey为True时所有子图共享x或y轴,为False时子图的x,y轴均为独立
    fig, axs = plt.subplots(nrows=10, ncols=10, sharex=True, sharey=True, figsize=(10, 10))
    # 1.使用axs[i][j]选中第i+1行j+1列的子图框
    # 2.matplotlib.pyplot.matshow(A,cmap),A-"矩阵"(一个矩阵元素对应一个图像像素),cmap-一种颜色映射方式
    # 3.matplotlib.cm为色表,binary为灰度图像标准色表,matshow为可绘制矩阵的函数
    # 4.xticks(ticks,labels),ticks-x轴刻度位置的列表,若传入空列表则不显示x轴,labels-放在指定刻度位置的标签文本
    for i in range(10):
        for j in range(10):
            axs[i][j].matshow(sample_images[i * 10 + j].reshape(20, 20).T, cmap=matplotlib.cm.binary)
    plt.xticks(np.array([]))
    plt.yticks(np.array([]))
    plt.show()

main.py 

# scipy.io模块提供了很多函数来处理Matlab的数组
from scipy.io import loadmat  # loadmat方法可以导入Matlab格式数据
from plot_training_set import *  # 绘制训练集数据

data = loadmat('ex3data1.mat')
plotTrainingSet(data)

1.3 Vectorizing Logistic Regression

内容:因为有10个数字类别,所以我们要做10个不同的逻辑回归分类器。将逻辑回归向量化会使训练效率更加高效。

1.3.1 Vectorizing the cost function(no regularization)

sigmoid.py

import numpy as np
def Sigmoid(z):
    return 1 / (1 + np.exp(-z))

cost_function.py(with regularization)

import numpy as np
from sigmoid import *

def costFunction(theta, X, y, learningRate):
    theta = np.matrix(theta)
    X = np.matrix(X)
    y = np.matrix(y)
    m = len(X)
    first = np.multiply(y, np.log(Sigmoid(X * theta.T)))
    second = np.multiply(1 - y, np.log(1 - Sigmoid(X * theta.T)))
    reg = (learningRate / (2 * m)) * np.sum(np.power(theta[:, 1:theta.shape[1]], 2))  # theta0项不用正则化
    return np.sum(first + second) * (-1) / m + reg

1.3.2 Vectorizing the gradient(no regularization)

gradient.py

import numpy as np
from sigmoid import *

def computeGradient(theta, X, y):
    X = np.matrix(X)
    y = np.matrix(y)
    theta = np.matrix(theta)
    m = len(X)
    grad = ((Sigmoid(X * theta.T) - y).T * X) / m
    return grad

1.3.3 Vectorizing regularized logistic regression

gradient.py

import numpy as np
from sigmoid import *

def computeGradient(theta, X, y, learningRate):
    X = np.matrix(X)
    y = np.matrix(y)
    theta = np.matrix(theta)
    m = len(X)
    grad = ((((Sigmoid(X * theta.T) - y).T * X)).T + learningRate * theta.T) / m
    grad[0][0] = (Sigmoid(X * theta.T) - y).T * X[:, 0] / m
    return grad

1.4 One-vs-all Classification

内容:构建分类器,由于逻辑回归只能在两个类别之间进行分类,所以我们需要多类分类的策略。对于每一个分类器我们只需要判断它的类别是'i'或者不是'i'即可。

one_vs_all.py

from scipy.optimize import minimize  # 提供最优化算法函数
import numpy as np
from cost_function import *  # 代价函数
from gradient import *  # 梯度

def one_vs_all(X, y, num_labels, learningRate):
    rows = X.shape[0]
    cols = X.shape[1]
    all_theta = np.zeros((num_labels, cols + 1))  # 对于num_labels(10分类)的全部theta定义
    X = np.insert(X, 0, values=np.ones(rows), axis=1)  # 放入X0项,为1 (axis=1:按列放置)
    # 进行逻辑分类(做10个分类器)
    for i in range(1, num_labels + 1):
        theta = np.zeros(cols + 1)
        y_i = np.array([1 if label == i else 0 for label in y]).reshape(rows, 1)
        y_i = np.reshape(y_i, (rows, 1))
        # 1.fun:目标函数costFuntion
        # 2.x0:初始的猜测
        # 3.args=():优化的附加参数
        # 4.计算梯度的方法
        # method:要使用的方法名称,这里使用的TNC(截断牛顿算法)
        fmin = minimize(fun=costFunction, x0=theta, args=(X, y_i, learningRate), method='TNC', jac=computeGradient)
        all_theta[i - 1:] = fmin.x  # fmin.x是theta的值
    return all_theta

main.py

# scipy.io模块提供了很多函数来处理Matlab的数组
from scipy.io import loadmat  # loadmat方法可以导入Matlab格式数据
import numpy as np
from one_vs_all import *

data = loadmat('ex3data1.mat')
X = data['X']
y = data['y']
theta = np.zeros(X.shape[1])
all_theta = one_vs_all(X, y, 10, 1)
print(all_theta)

[[-2.38358610e+00  0.00000000e+00  0.00000000e+00 ...  1.30435711e-03
  -7.45365860e-10  0.00000000e+00]
 [-3.18324551e+00  0.00000000e+00  0.00000000e+00 ...  4.45577193e-03
  -5.07998907e-04  0.00000000e+00]
 [-4.79716788e+00  0.00000000e+00  0.00000000e+00 ... -2.87443285e-05
  -2.47862001e-07  0.00000000e+00]
 ...
 [-7.98546406e+00  0.00000000e+00  0.00000000e+00 ... -8.95211947e-05
   7.22094621e-06  0.00000000e+00]
 [-4.57261766e+00  0.00000000e+00  0.00000000e+00 ... -1.33564925e-03
   9.98868166e-05  0.00000000e+00]
 [-5.40500039e+00  0.00000000e+00  0.00000000e+00 ... -1.16648642e-04
   7.88651180e-06  0.00000000e+00]]

1.4.1 One-vs-all Prediction 

内容:使用之前训练好的分类器来预测标签(概率最大的那一类即为标签,精确度可达94%)。

predict_all.py

import numpy as np
from sigmoid import *

def predictAll(X, all_theta):
    rows = X.shape[0]
    X = np.insert(X, 0, values=np.ones(rows), axis=1)
    X = np.matrix(X)
    all_theta = np.matrix(all_theta)
    h_theta = Sigmoid(X * all_theta.T)

    # np.argmax(arr,axis)返回数组arr中最大值的索引值
    h_theta_max = np.argmax(h_theta, axis=1)
    return h_theta_max + 1

main.py

# scipy.io模块提供了很多函数来处理Matlab的数组
from scipy.io import loadmat  # loadmat方法可以导入Matlab格式数据
import numpy as np
from sklearn.metrics import classification_report  # 常用的输出模型评估报告方法
from one_vs_all import *
from predict_all import *  # 预测h_theta值

data = loadmat('ex3data1.mat')
X = data['X']
y = data['y']
theta = np.zeros(X.shape[1])
all_theta = one_vs_all(X, y, 10, 1)
y_pred = predictAll(X, all_theta)
# classification_report(y_true,y_pred)y_true:真实值,y_pred:预测值
print(classification_report(y, np.array(y_pred)))
# precision recall f1-score support
# 精确率     召回率  调和平均数  支持度(指原始的真实数据中属于该类的个数)

              precision    recall  f1-score   support

           1       0.95      0.99      0.97       500
           2       0.95      0.92      0.93       500
           3       0.95      0.91      0.93       500
           4       0.95      0.95      0.95       500
           5       0.92      0.92      0.92       500
           6       0.97      0.98      0.97       500
           7       0.95      0.95      0.95       500
           8       0.93      0.92      0.92       500
           9       0.92      0.92      0.92       500
          10      0.97      0.99      0.98       500

    accuracy                           0.94      5000
   macro avg       0.94      0.94      0.94      5000
weighted avg       0.94      0.94      0.94      5000

2. Neural Networks

内容:神经网络可以处理比较复杂的非线性模型,这里给出了已经训练好的权重,我们使用前向传播即可。

2.1 Model representation

内容:

theta1:25*401     theta2:10*26

main.py

from scipy.io import loadmat
import numpy as np

data = loadmat('../ex3data1.mat')
X = np.matrix(data['X'])
X = np.insert(X, 0, values=np.ones(X.shape[0]), axis=1)  # axis=1即按列插入
y = np.matrix(data['y'])
weights = loadmat('ex3weights.mat')
theta1, theta2 = np.matrix(weights['Theta1']), np.matrix(weights['Theta2'])
print(theta1.shape, theta2.shape, X.shape, y.shape)

 (25, 401) (10, 26) (5000, 401) (5000, 1)

2.2 Feedforward Propagation and Prediction

sigmoid.py

import numpy as np

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

main.py(输出a3,即h_theta的值)

from scipy.io import loadmat
import numpy as np
from sigmoid import *  # 激活函数

data = loadmat('../ex3data1.mat')
X = np.matrix(data['X'])
X = np.insert(X, 0, values=np.ones(X.shape[0]), axis=1)  # axis=1即按列插入
y = np.matrix(data['y'])
weights = loadmat('ex3weights.mat')
theta1, theta2 = np.matrix(weights['Theta1']), np.matrix(weights['Theta2'])

# 神经网络-前向反馈
a1 = X
z2 = a1 * theta1.T
# print(z2.shape)  # (5000, 25)
a2 = Sigmoid(z2)
a2 = np.insert(a2, 0, values=np.ones(a2.shape[0]), axis=1)  # 加偏置项,值为1
z3 = a2 * theta2.T
# print(z3.shape)  # (5000,10)
a3 = Sigmoid(z3)  # h_theta
print(a3)

[[1.12661530e-04 1.74127856e-03 2.52696959e-03 ... 4.01468105e-04
  6.48072305e-03 9.95734012e-01]
 [4.79026796e-04 2.41495958e-03 3.44755685e-03 ... 2.39107046e-03
  1.97025086e-03 9.95696931e-01]
 [8.85702310e-05 3.24266731e-03 2.55419797e-02 ... 6.22892325e-02
  5.49803551e-03 9.28008397e-01]
 ...
 [5.17641791e-02 3.81715020e-03 2.96297510e-02 ... 2.15667361e-03
  6.49826950e-01 2.42384687e-05]
 [8.30631310e-04 6.22003774e-04 3.14518512e-04 ... 1.19366192e-02
  9.71410499e-01 2.06173648e-04]
 [4.81465717e-05 4.58821829e-04 2.15146201e-05 ... 5.73434571e-03
  6.96288990e-01 8.18576980e-02]]

进行预测(精确度可以达到97%): 

main.py

from scipy.io import loadmat
from sklearn.metrics import classification_report
import numpy as np
from sigmoid import *  # 激活函数

data = loadmat('../ex3data1.mat')
X = np.matrix(data['X'])
X = np.insert(X, 0, values=np.ones(X.shape[0]), axis=1)  # axis=1即按列插入
y = data['y']
weights = loadmat('ex3weights.mat')
theta1, theta2 = np.matrix(weights['Theta1']), np.matrix(weights['Theta2'])

# 神经网络-前向反馈
a1 = X
z2 = a1 * theta1.T
a2 = Sigmoid(z2)
a2 = np.insert(a2, 0, values=np.ones(a2.shape[0]), axis=1)  # 加偏置项,值为1
z3 = a2 * theta2.T
a3 = Sigmoid(z3)  # h_theta
y_pred = np.argmax(a3, axis=1) + 1  # 每一项的预测值
print(classification_report(y, np.array(y_pred)))

              precision    recall  f1-score   support

           1       0.97      0.98      0.98       500
           2       0.98      0.97      0.98       500
           3       0.98      0.96      0.97       500
           4       0.97      0.97      0.97       500
           5       0.97      0.98      0.98       500
           6       0.98      0.99      0.98       500
           7       0.98      0.97      0.97       500
           8       0.98      0.98      0.98       500
           9       0.97      0.96      0.96       500
          10      0.98      0.99      0.99       500

    accuracy                           0.98      5000
   macro avg       0.98      0.98      0.98      5000
weighted avg       0.98      0.98      0.98      5000

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

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

相关文章

【ESP-IDF】如何安装ESP-IDF?

【ESP-IDF】如何安装ESP-IDF?Windows命令行安装ESP-IDFVs Code 图形IDE首先参考这篇视频:https://www.bilibili.com/blackboard/webplayer/embed-whitelist-other.html?aid520120377&bvidBV1hM411k7zz&cid888070526&page1本篇教程以Windows…

vue2路由守卫

全局前置_路由守卫 以前古代有一个职称叫御前侍卫:保护君王的安全,而路由守卫就是保护路由的安全(权限) 就是在Home组件中,我们需要先校验内容中的school是否满足要求,才能展示组件,否则不展示…

SpringBoot项目中遇到的订单支付超时未支付关闭订单的解决方案

1、扫表轮循 定时任务 > 获取数据 > 数据层 > 筛选出过期的数据 > 批量关闭超时订单 优点:实现简单、适用于小项目、数据量比较少 缺点:订单量过大的时候查询和修改数据库压力大、服务器内存消耗大、IO瓶颈 2、Redis懒删除 用户获取订单信…

java SSM选房管理系统idea开发mysql数据库java编程计算机网页源码maven项目

一、源码特点 SSM选房管理系统是一套完善的完整医院类型系统,结合SSM(SpringSpringMVCMyBatis)框架和bootstrap完成本系统,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发),系…

Twitter的推荐系统开源了,Twitter的推荐系统是什么样的呢?Twitter推荐系统的架构说明

Twitter的推荐系统开源了,Twitter的推荐系统是什么样的呢?Twitter推荐系统的架构说明01. Twitter的推荐系统是什么样的?02. Candidate Sources2.1 In-Network Source2.2 Out-of-Network Sources03. Ranking04. Heuristics, Filters, and Prod…

VR虚拟核电设备拆除模拟培训降低风险

核电站设备拆除是一项高危、复杂的任务,因此进行安全、有效的培训至关重要。为此,将VR虚拟现实技术应用于核电厂中,通过100%模拟还原真实的拆除操作场景,广泛应用到核电厂展示、巡检和拆除等环节中,极大提高了生产效率…

单片机学习之中断与定时/计数器

记录学习中断的使用。 1. 使用工具 使用开发板: 普中科技开发板 编译软件: keil 2. 复习中断及相关概念 CPU在处理 事件A 时,中断源 发出中断请求,请求cpu处理事件B ,cpu 中断 当前工作,转去处理事件B&a…

HTML5 视频 Video

文章目录HTML5 视频 VideoWeb站点上的视频浏览器支持HTML5 (视频)- 如何工作视频格式与浏览器的支持视频格式HTML5 \<video> - 使用 DOM 进行控制HTML5 Video 标签HTML5 视频 Video 很多站点都会使用到视频. HTML5 提供了展示视频的标准。 Web站点上的视频 直到现在&am…

详解数据恢复多少一个g以及如何恢复

整理电脑硬盘数据的时候不小心删除了重要的文件该如何么恢复呢?硬盘修复数据恢复价格都爱的贵不贵?今天小编就来给大家重点当前市场上硬盘数据恢复的价格相关内容&#xff0c;那么数据恢复多少钱一个g呢?下面就来给大家揭晓一下数据恢复多少钱一个g以及如何恢复。 工具/原料…

全国青少年电子信息智能创新大赛(决赛)python·模拟三卷,含答案解析

全国青少年电子信息智能创新大赛(决赛) python 模拟三卷 一、程序题 第一题:描述 现有 n 个人依次围成一圈玩游戏,从第 1 个人开始报数,数到第 m 个人出局,然 后从出局的下一个人开始报数,数到第 m 个人又出局,...,如此反复到只剩下 最后一个是胜利者。设 n 个人的编号…

常用 Composition API--工程文件及setup

官方文档: https://v3.cn.vuejs.org/guide/composition-api-introduction.html 分析工程结构 vue3新添加的东西或修改的内容 首先import { createApp } from vue引入的不再是Vue的构造函数了&#xff0c;而是一个createAPP的工厂函数&#xff0c;什么是工厂函数&#xff1f; …

【TimeSerias】Transformer

Sequence 1. rnn 和 cnn RNN 很难并行化CNN很难捕捉较远的信息 2. Self-attention 拿每个query q去对每个 key k做attention 计算输出 Self-attition 矩阵计算 qiWqaikiWkqiviWvaiQWqAKWkAVWvA(1.1)\begin{align*} q^i & W^q a^i \\ k^i & W^k q^i \\ v^i & W…

WordPress图片水印插件 Easy Watermark

1、概述 WordPress图片水印插件Easy Watermark 是一款实现上传图片自动添加水印LOGO功能的高效插件。当我们在WordPress网站后台上传图片文件到媒体库时&#xff0c;或者在发布文章上传图片时&#xff0c;Easy Watermark 都能为图片自动添加水印&#xff0c;同时&#xff0c;还…

《计算机网络-自顶向下》06. 链路层和局域网

文章目录链路层概述链路层提供的服务链路层在何处实现差错检测和纠正技术奇偶校验循环冗余检测多路访问协议信道划分协议随机接入协议时隙 ALOHAALOHA载波侦听多路访问 —— CSMA具有碰撞检测的载波侦听多路访问 —— CSMA/CDCSMA/CD 效率轮流协议DOCSIS&#xff1a;用于电缆因…

c++11 标准模板(STL)(std::stack)(五)

定义于头文件 <stack> template< class T, class Container std::deque<T> > class stack; std::stack 类是容器适配器&#xff0c;它给予程序员栈的功能——特别是 FILO &#xff08;先进后出&#xff09;数据结构。 该类模板表现为底层容器的包…

C++实现:学生管理系统(详细解析)

目录 1.题目要求 2.需求分析 3.整体设计 4.详细设计 主函数设计 学科科目类 主菜单 读取文件与写入文件 效果如下 添加学生信息 删除学生信息 ​编辑 修改学生信息 显示信息列表 显示学生列表 将学生列表按学号升序排列 将学生列表按平均分降序排列&#xff0c;平…

文件操作File类,OutputStream、InputStream、Reader、Writer的用法

文章目录File 类OutputStream、InputStreamInputStreamOutputStreamReader、WriterReaderWriter注意事项简单模拟实战File 类 Java标准库中提供的File类是对硬盘上的文件的抽象&#xff0c;每一个File对象代表了一个文件&#xff0c;因为文件在硬盘上存储&#xff0c;而直接操…

4月11日作业修订

A.这主要看你互斥锁锁的资源是那部分的&#xff0c;如果是进程内资源&#xff0c;则可以实现同一进程不同线程之间的互斥&#xff0c;而如果将共享内存作为互斥锁进行操作则可以实现不同进程之间的互斥。 B.这是必然的&#xff0c;加锁是为了防止数据的二义性 C.信号量同时使…

代码规范(以后会补充)

目录 为什么要规范代码 不规范的代码有什么特点 ​编辑 不规范的坏处 规范代码是什么样的 如何规范代码 1.代码中不要出现莫名其妙的数字 2.深度嵌套 3.注释 4.避免创建大函数 5.重复代码 6.变量命名 7.函数命名 8.命名时注意动词的使用 9. 常量值所有都大写 10. 避免变…

Bossies 2016:最佳开源大数据工具

导读在今年的 Bossie开源大数据工具中&#xff0c;你会发现最新最好的方法是利用大型集群进行索引、搜索、图形处理、流处理、结构化查询、分布式OLAP和机器学习&#xff0c;因为众多处理器和RAM可降低工作量级。 处理大数据可能会遇到各种各样的问题&#xff0c;目前没有任何工…