利用神经网络预测手写数字

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import loadmat
import scipy.optimize as opt
from sklearn.metrics import classification_report  # 这个包是评价报告
from sklearn.preprocessing import OneHotEncoderdef expand_y(y):"""设置标签值为向量 例如y[0]=6转化为y[0]=[0,0,0,0,0,1,0,0,0,0]"""result = []for i in y:y_array = np.zeros(10)y_array[i-1] = 1result.append(y_array)return np.array(result)def load_mat(path):'''读取数据'''data = loadmat('ex4data1.mat')  # loadmat返回值是一个字典X = data['X']                   # X中存储的是像素值   5000*400y = data['y'].flatten()         # flatten函数返回一维数组  1*5000return X, ydef load_weight(path):"""读取权重函数"""data = loadmat(path)return data['Theta1'], data['Theta2']def sigmoid(z):"""sigmoid函数"""return 1 / (1 + np.exp(-z))def feed_forward(theta, X):'''得到每层的输入和输出'''t1, t2 = deserialize(theta)   # 提取参数 t1是第一层到第二层的  t2是第二层到第三层的a1 = X   #初始值z2 = a1 @ t1.T   # X乘参数a2 = np.insert(sigmoid(z2), 0, 1, axis=1)  #加a0 并且放入sigmoid函数中z3 = a2 @ t2.T   #第二层到第三层a3 = sigmoid(z3)return a1, z2, a2, z3, a3def cost(theta, X, y):a1, z2, a2, z3, h = feed_forward(theta, X)#前馈神经网络 第一层401个单元 第二层26个单元 第三层10个单元J = - y * np.log(h) - (1 - y) * np.log(1 - h)    #矩阵点乘return J.sum() / len(X)def regularized_cost(theta, X, y, l=1):'''正则化时忽略每层的偏置项,也就是参数矩阵的第一列'''t1, t2 = deserialize(theta)reg = np.sum(t1[:,1:] ** 2) + np.sum(t2[:,1:] ** 2)    # 正则项return l / (2 * len(X)) * reg + cost(theta, X, y)    # 代价函数def deserialize(seq):'''提取参数'''return seq[:25*401].reshape(25, 401), seq[25*401:].reshape(10, 26)def serialize(a, b):'''展开参数'''return np.r_[a.flatten(),b.flatten()]def sigmoid_gradient(z):"""sigmoid函数求导"""return sigmoid(z) * (1 - sigmoid(z))def random_init(size):'''从服从的均匀分布的范围中随机返回size大小的值'''return np.random.uniform(-0.12, 0.12, size)def gradient(theta, X, y):'''unregularized gradient, notice no d1 since the input layer has no errorreturn 所有参数theta的梯度,故梯度D(i)和参数theta(i)同shape,重要。'''t1, t2 = deserialize(theta)a1, z2, a2, z3, h = feed_forward(theta, X)d3 = h - y  # (5000, 10)d2 = d3 @ t2[:, 1:] * sigmoid_gradient(z2)  # (5000, 25)D2 = d3.T @ a2  # (10, 26)D1 = d2.T @ a1  # (25, 401)D = (1 / len(X)) * serialize(D1, D2)  # (10285,)return Ddef gradient_checking(theta, X, y, e=0.0001):def a_numeric_grad(plus, minus):"""对每个参数theta_i计算数值梯度,即理论梯度。"""return (regularized_cost(plus, X, y) - regularized_cost(minus, X, y)) / (e * 2)numeric_grad = []for i in range(len(theta)):plus = theta.copy()  # deep copy otherwise you will change the raw thetaminus = theta.copy()plus[i] = plus[i] + eminus[i] = minus[i] - egrad_i = a_numeric_grad(plus, minus)numeric_grad.append(grad_i)numeric_grad = np.array(numeric_grad)analytic_grad = regularized_gradient(theta, X, y)diff = np.linalg.norm(numeric_grad - analytic_grad) / np.linalg.norm(numeric_grad + analytic_grad)print('If your backpropagation implementation is correct,\nthe relative difference will be smaller than 10e-9 (assume epsilon=0.0001).\nRelative Difference: {}\n'.format(diff))def regularized_gradient(theta, X, y, l=1):"""不惩罚偏置单元的参数   正则化神经网络"""D1, D2 = deserialize(gradient(theta, X, y))t1[:, 0] = 0t2[:, 0] = 0reg_D1 = D1 + (l / len(X)) * t1reg_D2 = D2 + (l / len(X)) * t2return serialize(reg_D1, reg_D2)def nn_training(X, y):init_theta = random_init(10285)  # 25*401 + 10*26res = opt.minimize(fun=regularized_cost,x0=init_theta,args=(X, y, 1),method='TNC',jac=regularized_gradient,options={'maxiter': 400})return resdef accuracy(theta, X, y):_, _, _, _, h = feed_forward(res.x, X)y_pred = np.argmax(h, axis=1) + 1print(classification_report(y, y_pred))# def plot_100_images(X):
#     """随机画100个数字"""
#     index = np.random.choice(range(5000), 100)  # 随机选择索引
#     images = X[index]            # 选择随机索引的像素值
#     fig, ax_array = plt.subplots(10, 10, sharey=True, sharex=True, figsize=(8, 8))  # 画出10列10行的图像 设定尺寸
#     for r in range(10):   # 遍历10行10列
#         for c in range(10):
#             ax_array[r, c].matshow(images[r*10 + c].reshape(20,20), cmap='gray_r')    # 每一幅图的尺寸都是20*20 像素点存在images中
#     plt.xticks([])  # 取消x轴坐标
#     plt.yticks([])
#     plt.show()# ——————————————1.加载数据及可视化——————————————————
X,y = load_mat('ex4data1.mat')
# plot_100_images(X)# ——————————————2.模型表示——————————————————
# 输入有400个单元 三层神经网络
# ——————————————2.1 读取数据——————————————————
raw_X, raw_y = load_mat('ex4data1.mat')
X = np.insert(raw_X, 0, 1, axis=1)  # 加一列x0 (5000, 401)
y = expand_y(raw_y)  #(5000, 10)# ——————————————2.2 读取权重——————————————————
# 第二层25个元素
t1, t2 = load_weight('ex4weights.mat')  # ((25, 401), (10, 26))# ——————————————2.3 展开参数——————————————————
theta = serialize(t1, t2)  # 扁平化参数,25*401+10*26=10285# ——————————————3. 训练神经网络——————————————————
# gradient_checking(theta, X, y)#这个运行很慢,谨慎运行
res = nn_training(X, y)#慢
print (res)
# ——————————————4. 检验——————————————————
accuracy(res.x, X, raw_y)

吴恩达机器学习作业4(python实现)相关推荐

  1. Ex6_机器学习_吴恩达课程作业(Python):SVM支持向量机(Support Vector Machines)

    Ex6_机器学习_吴恩达课程作业(Python):SVM支持向量机(Support Vector Machines) 文章目录 Ex6_机器学习_吴恩达课程作业(Python):SVM支持向量机(Su ...

  2. k均值算法python实现(吴恩达机器学习作业)

    k均值算法python实现(吴恩达机器学习作业) 题目要求 数据集 读取mat文件 K-means 实现 结果 问题 题目要求 采用K均值算法对样本进行聚类. 编写K均值算法源代码,对ex7data2 ...

  3. 吴恩达机器学习作业7 - K-means和PCA主成分分析(Python实现)

    吴恩达机器学习作业7 - K-means和PCA主成分分析(Python实现) Introduction 在本实验中,将实现K-means聚类算法,并将其应用于图像压缩.在第二部分实验中,将使用主成分 ...

  4. 吴恩达机器学习作业ex2-python实现

    系列文章目录 吴恩达机器学习作业ex1-python实现 吴恩达机器学习作业ex2-python实现 吴恩达机器学习作业ex3-python实现 作业说明及数据集 链接:https://pan.bai ...

  5. 第一章-机器学习简介 深度之眼_吴恩达机器学习作业训练营

    目录 专栏简介: 一,机器学习简介 1.1 机器学习定义 1.1 机器学习的重要性 1.2 应用领域 二.监督学习 三.无监督学习 四.总结 专栏简介: 本栏主要内容为吴恩达机器学习公开课的学习笔记, ...

  6. 吴恩达机器学习作业Python实现(八):异常检测和推荐系统

    吴恩达机器学习系列作业目录 1 Anomaly detection 这部分,您将实现一个异常检测算法来检测服务器计算机中的异常行为.他的特征是测量每个服务器的响应速度(mb/s)和延迟(ms).当你的 ...

  7. 吴恩达机器学习作业Python实现(七):K-means和PCA主成分分析

    吴恩达机器学习系列作业目录 1 K-means Clustering 在这个练习中,您将实现K-means算法并将其用于图像压缩.通过减少图像中出现的颜色的数量,只剩下那些在图像中最常见的颜色. 1. ...

  8. 吴恩达机器学习作业Python实现(六):SVM支持向量机

    吴恩达机器学习系列作业目录 1 Support Vector Machines 1.1 Example Dataset 1 %matplotlib inline import numpy as np ...

  9. 吴恩达机器学习作业Python实现(五):偏差和方差

    吴恩达机器学习系列作业目录 在本练习中,您将实现正则化的线性回归和多项式回归,并使用它来研究具有不同偏差-方差属性的模型 1 Regularized Linear Regression 正则线性回归 ...

  10. 吴恩达机器学习作业Python实现(三):多类分类和前馈神经网络

    吴恩达机器学习系列作业目录 1 多类分类(多个logistic回归) 我们将扩展我们在练习2中写的logistic回归的实现,并将其应用于一对多的分类(不止两个类别). import numpy as ...

最新文章

  1. # 2021华为软件精英挑战赛C/C++——build.sh/build_and_run.sh/CodeCraft_zip.sh注释
  2. 标准浏览器的选择器封装
  3. CyberLink ColorDirector Ultra(视频调色工具)中文版
  4. 在新的标签页中代开编辑文件
  5. IDA Plugin 编写基础
  6. linux 7 没有权限访问,[CentOS 7系列]文件或目录的权限与属性
  7. (转)基于svnserve的服务器,权限文件authz配置的常见问题及解答
  8. linux装服务器系统,linux服务器系统安装
  9. 第一批90后已经30岁了,更扎心的是…
  10. Mouse Event (Java AWT)
  11. Docker 三剑客之 Docker Compose
  12. 微信小程序 图片处理的几个样式
  13. 精美男女装、韩版、日系证件照素材合集,P个美美的证件照,不再烦恼
  14. 保护模式下的80386及其编程04:中断及异常
  15. 计算机用户名,账户名更改
  16. 三年级计算机活动记录,小学三年级主题班会活动记录
  17. Java经典代码工具类2
  18. 关于压缩文件后删除源文件的一点问题
  19. jekins基本配置
  20. JavaSEDemo33

热门文章

  1. MySQL server has gone away 问题的解决方法
  2. .c和.h文件的区别(转载)
  3. .net常用面试核心技术点(持续更新中)
  4. v-cloak 的用法
  5. Markdown写作入门
  6. WPF动画1---基础动画
  7. MySQL 5.7.18的安装与主从复制
  8. idea 常用设置初始化
  9. IOS开发-UIView之动画效果的实现方法(合集)
  10. 序《戎马书生马福祥》