ex3是机器学习中经典的手写数字识别(使用逻辑回归分类),给出的数据是.mat后缀,可以用python中load方法加载数据。手写体“1”到“9”的类别分别标为1-9,“0”被标记为10。

这里先随机抽取100个手写体绘图出来查看。

import scipy.io as scio
import numpy as np
import matplotlib.pyplot as pltpath = 'ex3data1.mat'
data = scio.loadmat(path)
# 随机选取100个展示
sample_idx = np.random.choice(np.arange(len(data['X'])), 100)
sample_image = data['X'][sample_idx, :]fig, ax_array = plt.subplots(nrows=10, ncols=10, figsize=(12, 12))
for r in range(10):for c in range(10):ax_array[r, c].matshow(np.array(sample_image[10 * r + c].reshape((20, 20))).T)plt.xticks(np.array([]))plt.yticks(np.array([]))
plt.show()

ex3作业运用的模型依旧是逻辑回归,不过也可以使用人工神经网络(手写体识别用的多的是人工神经网络),所以我觉得ex3应该是一个过渡,ex4中用的是人工神经网络,包括作业最后也提了人工神经网络,也给了人工神经网络的模型训练结果供大家了解,其实也可以将逻辑回归看成一个没有隐藏层的人工神经网络。

手动实现函数:

# sigmoid函数
def sigmoid(z):return 1 / (1 + np.exp(-z))# 损失函数
def cost(theta, X, Y, learningRate):theta = np.matrix(theta)X = np.matrix(X)Y = np.matrix(Y)first = np.multiply(-Y, np.log(sigmoid(np.dot(X, theta.T))))second = np.multiply((1 - y), np.log(1 - sigmoid(np.dot(X, theta.T))))reg = (learningRate / (2 * len(X))) * np.sum(np.power(theta[:, 1:theta.shape[1]], 2))return np.sum(first - second) / len(X) + reg# 梯度下降
def gradient(theta, X, Y, learningRate):theta = np.matrix(theta).Th = sigmoid(np.dot(X, theta))error = h - Ygrad = (np.dot(X.T, error) / len(X)) + ((learningRate / len(X)) * theta)grad[0, 0] = np.dot(X[:, 0].T, error) / len(X)return np.array(grad).ravel()

多分类问题即是针对不同类别进行0-1分类,最后选取分类概率最大的类别,如下图:

例如识别手写体“1”时,将手写体“0”,“2”,···等的y设为0,手写体“1”设为1。

每个图像是400维的向量,所以输入维度为400,输出0或1(这里其实是十个模型,分别识别是否为手写体“1”、“2”、···,选择概率最大的结果)。

训练模型表现:

可以看出精确度还不错,为94%(ex4中使用人工神经网络实现,针对此类数据,人工神经网络的精确度会更高)。

源码:

import scipy.io as scio
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize
from sklearn.metrics import classification_reportpath = 'ex3data1.mat'
data = scio.loadmat(path)
# 随机选取100个展示
sample_idx = np.random.choice(np.arange(len(data['X'])), 100)
sample_image = data['X'][sample_idx, :]fig, ax_array = plt.subplots(nrows=10, ncols=10, figsize=(12, 12))
for r in range(10):for c in range(10):ax_array[r, c].matshow(np.array(sample_image[10 * r + c].reshape((20, 20))).T)plt.xticks(np.array([]))plt.yticks(np.array([]))
plt.show()# sigmoid函数
def sigmoid(z):return 1 / (1 + np.exp(-z))# 损失函数
def cost(theta, X, Y, learningRate):theta = np.matrix(theta)X = np.matrix(X)Y = np.matrix(Y)first = np.multiply(-Y, np.log(sigmoid(np.dot(X, theta.T))))second = np.multiply((1 - y), np.log(1 - sigmoid(np.dot(X, theta.T))))reg = (learningRate / (2 * len(X))) * np.sum(np.power(theta[:, 1:theta.shape[1]], 2))return np.sum(first - second) / len(X) + reg# 梯度下降
def gradient(theta, X, Y, learningRate):theta = np.matrix(theta).Th = sigmoid(np.dot(X, theta))error = h - Ygrad = (np.dot(X.T, error) / len(X)) + ((learningRate / len(X)) * theta)grad[0, 0] = np.dot(X[:, 0].T, error) / len(X)return np.array(grad).ravel()# 属性
learningRate = 1
input_size = 401
output_size = 10# 初始化x和y
x = np.insert(data['X'], 0, np.ones(data['X'].shape[0]), axis=1)
# 参数
res = np.zeros((input_size, output_size))
# 多分类拟合过程
for i in range(1, output_size+1):y = [1 if data['y'][j] == i else 0 for j in range(len(data['y']))]y = np.matrix(y).Ttheta = np.zeros(input_size)print(cost(theta, x, y, learningRate))fmin = minimize(fun=cost, x0=theta, args=(x, y, learningRate), method='TNC', jac=gradient)print(cost(fmin.x, x, y, learningRate))res[:, i-1] = fmin.xprint(res)
print(res.shape)num_labels = res.shape[0]
h = sigmoid(np.dot(x, res))
pred = np.argmax(h, axis=1)
pred = pred + 1
print(pred)print(classification_report(data['y'], pred))

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

  1. 目录:吴恩达机器学习课后作业

    简单介绍 本博客为作者自行完成的吴恩达机器学习课后练习题目录,均使用PyTorch进行实现,无法保证对错,仅供参考. 作业题目以及源代码 百度云盘连接 提取码:3dvb 题目的命名方式与下表中的作业名 ...

  2. 吴恩达机器学习课后作业——线性回归(Python实现)

    1.写在前面 吴恩达机器学习的课后作业及数据可以在coursera平台上进行下载,只要注册一下就可以添加课程了.所以这里就不写题目和数据了,有需要的小伙伴自行去下载就可以了. 作业及数据下载网址:吴恩 ...

  3. 吴恩达机器学习课后作业ex1(python实现)

    作业介绍 吴恩达老师的作业资源可以在github或者网上找到 . ex1主要是对线性回归的一些复习和梯度下降.损失函数等的具体代码实现. pdf文件是对作业的说明.文件夹则是作业数据的各种格式,pyt ...

  4. 吴恩达机器学习课后作业——偏差和方差

    1.写在前面 吴恩达机器学习的课后作业及数据可以在coursera平台上进行下载,只要注册一下就可以添加课程了.所以这里就不写题目和数据了,有需要的小伙伴自行去下载就可以了. 作业及数据下载网址:吴恩 ...

  5. 吴恩达机器学习课后作业1——单变量线性回归(Linear regression with one variable)

    1. 问题和数据 假设你是一家连锁餐车店的老板,但是你又和别的土老板不一样,你又刚好是个懂线性回归,还懂编程的老板,正在考虑在不同的城市开一家新店.该连锁店已经在各个城市开设了餐车,你可以获得这些城市 ...

  6. 吴恩达机器学习课后作业1.1——多变量线性回归(Linear regression with multiple variable)

    1. 问题和数据 假设你要卖掉你的房子,你想知道一个好的市场价格是多少.其中一种方法是,首先收集最近出售的房屋的信息.在本部分的练习中,你将使用多元线性回归来预测房屋价格. 数据ex1data2.tx ...

  7. 吴恩达机器学习课后作业——SVM支持向量机

    支持向量机 一.作业内容 在本练习的前半部分,您将对各种示例2D数据集使用支持向量机(svm).使用这些数据集进行试验将帮助您直观地了解支持向量机的工作方式,以及如何在支持向量机中使用高斯核.在练习的 ...

  8. 吴恩达机器学习课后作业——线性回归

    一.单变量线性回归 一.作业内容 假设你是一家特许经营餐厅的首席执行官,正在考虑在不同的城市开一家新店,该连锁店已经在各个城市开设了餐车,文件ex1data1.txt中包含你这些城市的利润和人口数据. ...

  9. 吴恩达机器学习课后作业Python实现(一):线性回归

    目录 前言 单变量线性回归 代码实现 数据集准备 代价函数 梯度下降 跑模型并预测 绘制线性模型及代价函数图 多元线性回归 代码实现 结果图 前言         写本篇文章的主要目的是记录自己机器学 ...

最新文章

  1. Genome Biology:人体各部位微生物组时间序列分析
  2. java 单字节_java文件读取。(单字节读取和按行读取读取)
  3. 《最后的守护者》的开发技术猜想
  4. SecureCRT自动记录日志
  5. Python 断言和异常
  6. java hdfs 指定用户目录_HDFS目录(文件 )权限管理
  7. java 内部类序列化_Gson如何序列化内部类
  8. CentOS 6.5使用本地光盘做yum源
  9. PCB的走线电阻的计算方法
  10. 数学建模-Logistic模型
  11. HTML——多选框和按钮、搜索框滑块简单验证
  12. 剑指 offer:变态跳水台
  13. 麦吉尔电子计算机工程专业好么,多大/UBC/麦吉尔,什么专业最厉害?
  14. 短视频配音的秘诀!你不会还在傻傻自己人声配音吧?
  15. w ndows7怎样连接无线网,windows7电脑如何连接wifi
  16. 数据结构(二)——单链表的头插与尾插
  17. 运放的原理、应用、参数和命名规则
  18. 中职计算机教育 论文题目,中职学校计算机教育论文
  19. 如何把python可视化到前端_Python一行代码搞定炫酷可视化,就用这个工具!
  20. SAP BP屏幕增强页签

热门文章

  1. 神经网络 mse一直不变_卷积神经网络中十大拍案叫绝的操作
  2. 01一起来吃西瓜——线性回归
  3. 在Windows应用程序中设计菜单栏、工具栏和状态栏
  4. ae教程 (三)三维空间合成(三)
  5. MySQL约束-自增长约束(auto_increment)、非空约束(not null)、唯一约束(unique)
  6. AndroidAudioConverter,音频格式无法转换问题
  7. 牛客网>在线编程 > 剑指Offer>入口
  8. 智慧养老解决方案,满足老人养老的所有问题,安享晚年-新导智能
  9. 郑州大学 oracle数据库,郑州大学软件学院oracle.doc
  10. 如何不冒昧的问妹子年龄又能清楚的知道她多大呢?Python来告诉你。