吴恩达机器学习python代码练习三(多类别分类)

2023-10-31

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import scipy.io as sio
from scipy.optimize import minimize
from sklearn.metrics import classification_report#这个包是评价报告

scipy中的loadmat官网地址:https://docs.scipy.org/doc/scipy/reference/generated/scipy.io.loadmat.html#scipy.io.loadmat

简单来说就是mat文件中的每一行是构成一个图片的像素强度矩阵,将每一行转化为20*20的矩阵既可以正确读取该图片。
在这里插入图片描述

path = 'E:\吴恩达\Machine_Learning_AndrewNg-master\Machine_Learning_AndrewNg-master\machine-learning-ex3\ex3data1.mat'
data = sio.loadmat(path)#loadmat返回的结果是一个字典,其中变量名字作为keys,内部矩阵作为对应的values
data.keys()#查看存储的变量
dict_keys(['__header__', '__version__', '__globals__', 'X', 'y'])

注意!!!

在这里应当注意:

  1. 本次计算使用的是array,并未使用矩阵计算,由于假设函数hypoth计算结果的shape为(n,),故(y_read).shape应为(n,)形式;若(y_read).shape为(n,1),当hypoth*y_read时,因y_read为二维数组,hypoth为一维数组,此时会触发数组的广播机制,使结果的shape变为(n,n)。
  2. 虽然两者的计算结果对该模型计算时的结果未产生影响(主要是由于costFunction中的np.mean()使得最终的结果一致,若改用np.sum()/len(y)来求均值就可以发现出错)但是在中间的一些过程产生了影响,可尝试输出costFunction的unreg_first和unreg_second的shape,可知差别。
    计算时若有一维数组(n,)使用,则计算时统一使用一维数组,切勿一维数组和二维数组混用(n,m),使用np.dot()时除外,使用np.dot二维与一维数组得到的是标量,二维与二维是数组ndarray。
x_read = data['X']
y_read = data['y']
y_read = y_read.ravel()
x_read_insert = np.insert(x_read,0,1,axis=1)
#c,s=np.unique(b,return_index=True) 去除数组中的重复数字,并进行排序之后输出
#return_index=True,默认为False。True时表示返回新列表元素在旧列表中的位置,并以列表形式储存在s中
np.unique(y_read)#(查看标签)
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10], dtype=uint8)
plt.imshow(x_read[-6,:].reshape(20,20),cmap='gray_r')#查看训练数据中的第0行的图形

在这里插入图片描述

lam =1
theta = np.zeros(x_read_insert.shape[1])
#假设函数
def hypoth(theta,x):
    z = x.dot(theta)
    return 1/(1+np.exp(-z))
hypoth(theta,x_read_insert)#尝试能否正常运行
array([0.5, 0.5, 0.5, ..., 0.5, 0.5, 0.5])

带有正则化的损失函数:
在这里插入图片描述

#带有正则化的损失函数,lam为λ:正则化系数
def costFunction(theta,x,y,lam):
    #未正则化部分
    unreg_first = (-y)*np.log(hypoth(theta,x))
    unreg_second = (1-y)*np.log(1-hypoth(theta,x))
    unreg = np.mean(unreg_first - unreg_second)
    #正则化部分(对theta0不进行正则化)
    reg = (lam/(2*x.shape[0])*np.sum(np.power(theta[1:],2)))
    return unreg + reg
costFunction(theta,x_read_insert,y_read,lam)
-17.051420641776012

带有正则化的梯度函数:
在这里插入图片描述

#带有正则化的梯度函数
def gdReg(theta,x,y,lam):
    unreg = x.T.dot(hypoth(theta,x)-y)/x.shape[0]
    theta_0 = theta
    theta_0[0] = 0 #将theta0改为0,即对theta0不考虑正则化
    reg = (lam/x.shape[0])*theta_0
    return unreg + reg
def one_vs_all(x, y,lam):
    y_read_label = np.unique(y)#去除重复数字,并排序
    params = x.shape[1]#theta的维度(数量)
    all_theta = np.zeros((len(y_read_label),params))#用来存储最终计算出来的theta值
    for num in range(len(y_read_label)):#在标签中遍历
        theta = np.zeros(params)
        y_i = np.array([1 if label_hypo == y_read_label[num] else 0 for label_hypo in y])#若y中的值与标签相同,记作1,否则记作0。多类分类的思想!!将其中一个看作1,其余视为0。
        fmin = minimize(fun=costFunction, x0=theta, args=(x, y_i, lam), method='TNC', jac=gdReg)
        all_theta[num,:] = fmin.x#将计算出的theta储存到all_theta中
    return all_theta
theta_all_final = one_vs_all(x_read_insert,y_read,lam)
def predict(theta,x):
    hy = hypoth(theta,x)
    p = np.argmax(hy,axis = 1) +1#argmax索引是从0开始的,而我们的是从1开始的
    return p
y_predic= predict(theta_all_final.T,x_read_insert)
y_predic.shape
(5000,)
print(classification_report(y_read, y_predic))

在这里插入图片描述

尝试识别自己写的数字

from  PIL  import  Image
mg1 =Image.open(r'E:\1.png')
def pre_own(theta,x):
    hy = hypoth(theta,x)
    p = np.argmax(hy)+1
    return p
L = mg1.convert('L')#将图片转化为灰度
mg = np.array(L)
mg.shape
(20, 20)
plt.imshow(mg,cmap='gray_r')

在这里插入图片描述

own_mg = np.concatenate([np.array([1]),mg.ravel()])#在原数组前添加1
own_mg.shape
(401,)
num_own = pre_own(theta_all_final.T,own_mg)
E:\Users\in\Anaconda3\lib\site-packages\ipykernel_launcher.py:4: RuntimeWarning: overflow encountered in exp
  after removing the cwd from sys.path.
num_own
4


虽然训练数据精确度挺高,但是我自己写的这么好为啥子都认不出来??????????

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

吴恩达机器学习python代码练习三(多类别分类) 的相关文章

  • 交付文档注意事项

    最近涉及到项目交付 编写了很多技术文档 但因为没有经验导致多次修改 尤其是客户和我们技术人员的关注点其实是不一样的 就导致我没有抓住重点 导致反复修改 这里总结下我的一些经验 文档与技术协议合同对应 就我所经历的项目 前期的技术要求和最后的

随机推荐

  • 十大必掌握C++11新特性

    简介 C 11 之前被称作C 0x 即ISO IEC 14882 2011 是目前的C 编程语言的正式标准 它取代第二版标准ISO IEC 14882 2003 第一版ISO IEC 14882 1998发布于1998年 第二版于2003年
  • OCR测试——字体和背景颜色

    测试目的 测试图片中字体颜色和背景颜色对文字识别的影响 一 测试图片选择 黑色字体 白色背景 黑色字体 橙色背景 绿色字体 黑色背景 绿色字体 白色背景 白色字体 绿色背景 白色字体 橙色背景 橙色字体 白色背景 混合色字体 混合色背景 二
  • c# 遍历文件夹下的.exe文件,找到主应用程序文件

    遍历文件夹下的文件 exe文件 public static string ForeachFiles string FilePath SearchOption AllDirectories 指遍历全部的子文件夹 所有都遍历一次 string
  • 见到的一篇IOCP流程 自己用demo实现了一下, 简单照抄,改动了一点点

    要分析的实例分为两个线程 分别是主线程 MAIN 还有一个是创建的线程 ServerThread 1 主函数完成初始化工作 1 1 主线程 HANDLE hCompletion CreateIoCompletionPort INVALID
  • 针对树莓派vnc连接被拒绝,树莓派固定ip后上不了网的问题

    三月份玩了会树莓派 实现树莓派小车的自动登录 自动连接wifi 固定ip和vnc远程连接 具体见之前的树莓派小车记录的博客里 昨天发现小车虽然可以连接wifi 固定ip 甚至能vnc连接但是没有网络 ping不通除了自身ip以外的任何地址
  • SpringBoot单元测试Mock静态方法

    这两天写单元测试碰到了一个问题 就是这个subnetmap里面的数据格式我不知道是怎么样的 所以直接mock掉返回自己指定的值吧 mockito库并不能 mock静态方法 需要依赖powermock这个库才能对静态方法mock 可以直接用这
  • fastadmin 配置完成后部署到服务器报找不到模块问题

    现象 本地直接安装的fastadmin框架可以正常运行 迁移到服务器或者给别人用的时候就不行了 跟这个问题差不多nginx配置了rewrite fastadmin后台首页可以访问 但一刷新会去首页 怎么办 FastAdmin问答社区 现象一
  • 代码走查和代码审查_21世纪的代码审查

    代码走查和代码审查 有句老话说 不要谈论宗教或政治 为什么 因为这些主题充满了强烈的见解 但客观答案却很薄弱 一个人的确定性就是另一个人的怀疑 别人的常识只是对那些持不同看法的人的先验偏见 可悲的是 与这些有争议的主题进行对话会产生比光更多
  • 三元运算符 使用

    三元运算符 三元表达式判断闰年 var b 2012 var year b 4 0 b 100 0 闰年 平年 console log year 判断奇数偶数 var a prompt 输入你要判断的数 var a 3 var res a
  • 使用docker部署springboot项目并连接上mysql数据库

    使用docker部署springboot项目并连接上mysql数据库 预览 http 8 142 6 23 screen 项目开源地址 前端vue https gitee com gaohan888 echarts learning tre
  • 旧版vue-cli脚手架Webpack3项目如何升级Webpack4

    vue cli脚手架出到了4 3 1版本 目前主推通过create命令来新建项目 与过去的vue cli2的init命令不同的是 create命令脚手架建完的项目webpack为4 而init采用的模板中引用的webpack版本还是3 单独
  • 程序人生-Hello’s P2P

    第一章 概述 1 1 Hello 简介 1 1 1 P2P Program to Process 从程序到进程 P2P指Hello c从源程序到进程的过程 Hello c经过预处理器的编译预处理 得到预编译文件Hello i Hello i
  • Java多对象的内存情况分析

    这种情况指的是在一个类中创建了多个对象 最先创建的对象直接指向类 后面创建的对象则指向第一个创建的对象 那么针对这种情况就会出现如下情况 1 照旧生成栈内存和堆内存 但是堆内存只会生成一个包含类中所有属性和方法的内存地址 2 因为后面创建的
  • 前端面试题集锦(6)

    目录 1 常见的兼容问题有哪些 1 1 获取标签节点 1 2 获取卷去的高度 1 3 获取样式 1 4 事件侦听器 1 5 事件解绑 1 6 事件对象的获取 1 7 阻止默认行为 1 8 阻止事件冒泡 1 9 获取精准的目标元素 1 10
  • Eclipse的Team菜单中没有SVN选项的解决方法

    Eclipse开发项目时想使用SVN来管理 但是发现Team gt Share Project菜单中没有SVN选项 只有一个GIT选项 如下图 解决方法 1 菜单栏Help gt Eclipse Marketplace 2 打开如下对话框
  • SQL 常用&高级 教程

    用SELECT INTO 或INSERT INTO复制表结构 数据 MySQL 数据库不支持 SELECT INTO 语句 但支持 INSERT INTO SELECT MySQL可以使用以下语句来 1 拷贝表结构及数据 CREATE TA
  • 【学习笔记】R数据科学(R for Data Science)—第3章 使用dplyr进行数据转换

    dplyr包是tidyverse中的一个核心R包 dplyr的5个核心函数 按值筛选观测 filter 对行进行重新排序 arrange 按名称选取变量 select 使用现有变量的函数创建新变量 mutate 将多个值总结为一个摘要统计量
  • 设置文本阴影和溢出效果

    一 文本阴影效果 方法一 显示字体时 根据要求 为文字阴影添加颜色以增强网页的吸引力 这时就需要用到CSS3样式中的text shadow属性 text shadow 阴影水平偏移值 可正负 阴影垂直偏移值 可正负 阴影模糊值 阴影颜色 后
  • 为什么 i&1 可以判断奇偶

    记录一下看到过几次但是总会遗忘的知识点 是位运算 在计算机里是只认识二进制的 我们人类用的一般是十进制 而二进制有个特点就是每一位上要么是0要么是1 还有一个特点是如果哪个位置是1 那一位的值就是2n 这个符号表示次方 n就是这个1所处的位
  • 吴恩达机器学习python代码练习三(多类别分类)

    import numpy as np import pandas as pd import matplotlib pyplot as plt import scipy io as sio from scipy optimize import