从0开始机器学习--Day16--神经网络作业

devtools/2024/11/14 11:17:23/

题目:构建逻辑回归模型来识别数字0-9

代码如下:

import numpy as np
from scipy.io import loadmat
import scipy.optimize as opt
from sklearn.metrics import classification_report# 定义函数sigmoid,方便后续假设函数以sigmoid(z)表示
def sigmoid(z):return 1 / (1 + np.exp(-z))# 定义代价函数
def computeCost (theta, X, y, l=1 ):predictions = sigmoid(X @ theta)first = y * np.log(predictions)second = (1 - y) * np.log(1 - predictions)reg = theta[1:]@theta[1:]*(l/(2*len(X)))   #正则化项return -np.sum(first + second)/len(X) +reg  # 返回标量def gradient(theta, X, y, l=1):reg = theta[1:] * (l/len(X))reg = np.insert(reg, 0, values=0, axis=0)first = (X.T@(sigmoid(X@theta)-y))/len(X)return first + regdef one_vs_all(X, y, l=1, K = 10):n = X.shape[1]theta = np.zeros((K, n)) #创建与X的列数相同长度的0数组for i in range(1, K+1):theta_i = np.zeros(n, )res = opt.minimize(fun=computeCost,x0=theta_i,args=(X, y==i, l),method='TNC',jac=gradient)theta[i-1, :] = res.xreturn thetadef predict(X, theta):h = sigmoid(X@theta.T)h_argmax = np.argmax(h, axis=1)return h_argmax + 1data = loadmat('ex3data1.mat')
raw_x = data['X']
raw_y = data['y']
X = np.insert(raw_x, 0, values=np.ones(raw_x.shape[0]), axis=1)
y = raw_y.flatten()
print(y.shape)
theta_all = one_vs_all(X, y, l=1, K=10)
print(theta_all)
y_pred = predict(X, theta_all)
acc = np.mean(y_pred == y)
print(acc)
print(classification_report(y, y_pred))

输出:

(5000,)
[[-2.38017165e+00  0.00000000e+00  0.00000000e+00 ...  1.30445260e-03-7.38340466e-10  0.00000000e+00][-3.18105182e+00  0.00000000e+00  0.00000000e+00 ...  4.45068628e-03-5.07434671e-04  0.00000000e+00][-4.79899590e+00  0.00000000e+00  0.00000000e+00 ... -2.86819678e-05-2.48325958e-07  0.00000000e+00]...[-7.98439304e+00  0.00000000e+00  0.00000000e+00 ... -8.94750803e-057.22839979e-06  0.00000000e+00][-4.57041525e+00  0.00000000e+00  0.00000000e+00 ... -1.33611163e-039.99192279e-05  0.00000000e+00][-5.40239782e+00  0.00000000e+00  0.00000000e+00 ... -1.16450568e-047.86669421e-06  0.00000000e+00]]
0.9446precision    recall  f1-score   support1       0.95      0.99      0.97       5002       0.95      0.92      0.93       5003       0.95      0.91      0.93       5004       0.95      0.95      0.95       5005       0.92      0.92      0.92       5006       0.97      0.98      0.97       5007       0.95      0.95      0.95       5008       0.93      0.92      0.92       5009       0.92      0.92      0.92       50010       0.97      0.99      0.98       500accuracy                           0.94      5000macro avg       0.94      0.94      0.94      5000
weighted avg       0.94      0.94      0.94      5000

神经网络前向传播计算准确率代码:

from scipy.io import loadmat
import numpy as np
from sklearn.metrics import classification_reportdef sigmoid(z):return 1 / (1 + np.exp(-z))data = loadmat('ex3data1.mat')
raw_x = data['X']
raw_y = data['y']
X = np.insert(raw_x, 0, values=np.ones(raw_x.shape[0]), axis=1)
y = raw_y.flatten()
print(y.shape)
theta = loadmat('ex3weights.mat')
theta1 = theta['Theta1']
theta2 = theta['Theta2']a1 = X
z2 = X@theta1.T
a2 = sigmoid(z2)
a2 = np.insert(a2, 0, values=1, axis=1)
z3 = a2@theta2.T
a3 = sigmoid(z3)
y_pred = np.argmax(a3, axis=1) + 1
acc = np.mean(y_pred == y)
print(acc)
print(classification_report(y, y_pred))

输出:

(5000,)
0.9752precision    recall  f1-score   support1       0.97      0.98      0.98       5002       0.98      0.97      0.98       5003       0.98      0.96      0.97       5004       0.97      0.97      0.97       5005       0.97      0.98      0.98       5006       0.98      0.99      0.98       5007       0.98      0.97      0.97       5008       0.98      0.98      0.98       5009       0.97      0.96      0.96       50010       0.98      0.99      0.99       500accuracy                           0.98      5000macro avg       0.98      0.98      0.98      5000
weighted avg       0.98      0.98      0.98      5000

总结:在构建多元分类的模型中,方法就是将其转化为二元分类,再做循环计算,这样每次只需要将本身看做为0或1即可,注意其每次循环时要取概率最高的那次才有意义。用神经网络时,其结果有点过于理想了,怀疑是出现了过拟合现象。

视频订正参考:【作业讲解】编程作业3:神经网络(上)_哔哩哔哩_bilibili


http://www.ppmy.cn/devtools/133910.html

相关文章

软考:缓存持久化和过期策略,淘汰策略

持久化: RDC(把全量数据以二进制压缩文件的方式存储到磁盘文件),快照,体积小,性能更高(会fork一个子进程来处理保存操作)恢复更快。 AOF(每一个写命令都通过write函数追…

行业类别-智能制造-子类别工业4.0-细分类别物联网应用-应用场景智能工厂建设

1.大纲分析 针对您提出的题目“4.0 行业类别-智能制造-子类别工业4.0-细分类别物联网应用-应用场景智能工厂建设”,以下是一个详细的大纲分析,旨在深入探讨该应用场景下的各个方面: 一、引言 智能制造与工业4.0概述 智能制造的定义与发展趋…

内置RTK北斗高精度定位的4G执法记录仪、国网供电服务器记录仪

内置RTK北斗高精度定位的4G执法记录仪、国网供电服务器记录仪BD311R 发布时间: 2024-10-23 11:28:42 一、 产品图片: 二、 产品特性: 4G性能:支持2K超高清图传,数据传输不掉帧,更稳定。 独立北…

Enhanced Table如何安装?

githup项目地址: https://github.com/fbaligand/kibana-enhanced-table/releases/tag/v1.12.0

mysql 几种启动和关闭mysql方法介绍

https://dev.mysql.com/doc/refman/5.7/en/programs-server.html mysql几种启动方法 方法1、mysqld mysqld指定读取my.cnf配置文件启动,加一个 & 实现后台启动。终端不会被阻塞 ./mysqld --defaults-file/etc/my.cnf &方法2、mysqld_safe ./mysqld_safe –d…

分享 | 中望3D 2025发布会提及的工业数字化MBD是什么?

本文为CAD芯智库原创,未经允许请勿复制、转载! 原文转自:www.xwzsoft.com/h-nd-487.html 今年中望CAD/中望3D 2025版新品发布会上,中望产品规划与GTM中心总监胡其登先生的专题演讲——《基于模型的CAx一体化研发管理平台&#xff…

【go从零单排】HTTP客户端和服务端

🌈Don’t worry , just coding! 内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。 📗概念 在 Go 语言中,net/http 包提供了强大的 HTTP 客户端和服务器功能。 &…

植物大战僵尸杂交版v2.6.1最新版本(附下载链接)

B站游戏作者潜艇伟伟迷于11月3日更新了植物大战僵尸杂交版2.6.1版本!!!,有b站账户的记得要给作者三连关注一下呀! 不多废话下载链接放上: 夸克网盘链接:https://pan.quark.cn/s/279e7ed9f878 新…