【深度之眼吴恩达机器学习第四期】笔记(六)

多个二分类实现多分类

导入包和准备数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 用来加载.mat数据
from scipy.io import loadmat

# 加载数据
data = loadmat('ex3data1.mat')
data

# ((5000, 400), (5000, 1))
data['X'].shape, data['y'].shape

# 输出数据图像
plt.rcParams['figure.figsize'] = (15.0, 8.0)
for i in range(10):
    plt.subplot(1,10,i+1)
    index = i*500
    plt.title(data['y'][index,0])
    plt.imshow(data['X'][index].reshape((20,20)).astype('uint8'))
    plt.axis('off')
plt.show()

data是手写数字的数据集。data的详情:ibG9nLmNzZG4ubmV0L3FxXzQwOTIzMTc3,size_16,color_FFFFFF,t_70
数据展示:在这里插入图片描述

Sigmoid、损失函数

在这里插入图片描述

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

def cost(theta, X, y, learningRate):
    # INPUT:参数值theta,数据X,标签y,学习率
    # OUTPUT:当前参数值下的交叉熵损失
    
    # STEP1:将theta, X, y转换为numpy类型的矩阵
    theta = np.matrix(theta)
    X = np.matrix(X)
    y = np.matrix(y)
    
    # STEP2:根据公式计算损失函数(不含正则化)
    sig = sigmoid(X@theta.T)
    cross_cost = (-y.T@np.log(sig)-(1-y).T@np.log(1-sig))/len(y)
    
    # STEP3:根据公式计算损失函数中的正则化部分
    reg = np.sum(np.power(theta[0,1:], 2))*learningRate/(2*len(y))
   
    # STEP4:把上两步当中的结果加起来得到整体损失函数
    whole_cost = cross_cost[0,0]+reg
    
    return whole_cost

刚开始的时候认为第一步的转化为np矩阵是冗余的,但是得到的准确率一直很低,找了很久的原因,才发现初始化的时候y.shape是(5000,1),而X@theta.T是(5000, 401)@ (401,)=(5000,)。这时候-y*np.log(sig)是(5000, 1)*(5000, )=(5000,5000),而不是我认为的(5000,)。
总而言之就是:转化为矩阵是有必要的或者直接全部reshape也可以,因为你不能确保传进来的数据是什么形式的。(5000, 1)与(5000, )的差别很大的。

梯度函数

在这里插入图片描述

def gradient(theta, X, y, learningRate):
    # INPUT:参数值theta,数据X,标签y,学习率
    # OUTPUT:当前参数值下的梯度
        
    # STEP1:将theta, X, y转换为numpy类型的矩阵
    theta = np.matrix(theta)
    X = np.matrix(X)
    y = np.matrix(y)
    
    # STEP3:计算预测的误差
    error = sigmoid(X@theta.T)-y
    
    # STEP4:根据上面的公式计算梯度
    regularized_term = (learningRate/len(y))* theta
    # 不用对theta0进行正则化
    regularized_term[0,0]=0
    grad = (error.T@X)/len(y)+regularized_term
    
    return np.array(grad).ravel()

梯度下降

逻辑回归是二分类算法,想要实现N分类就要使用N个二分类,每一个二分类只对应一个类(是这个类:1,不是这个类:0)

from scipy.optimize import minimize
# num_labels代表需要分多少类
def one_vs_all(X, y, num_labels, learning_rate):
    rows = X.shape[0]
    params = X.shape[1]
    # 初始化
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值