• 机器学习作业(三)多类别分类与神经网络——Python(numpy)实现


    题目太长了!下载地址【传送门

    第1题

    简述:识别图片上的数字。

      1 import numpy as np
      2 import scipy.io as scio
      3 import matplotlib.pyplot as plt
      4 import scipy.optimize as op
      5 
      6 #显示图片数据
      7 def displayData(X):
      8     m = np.size(X, 0)  #X的行数,即样本数量
      9     n = np.size(X, 1)  #X的列数,即单个样本大小
     10     example_width = int(np.round(np.sqrt(n)))  #单张图片宽度
     11     example_height = int(np.floor(n / example_width))  #单张图片高度
     12     display_rows = int(np.floor(np.sqrt(m)))  #显示图中,一行多少张图
     13     display_cols = int(np.ceil(m / display_rows))  #显示图中,一列多少张图片
     14     pad = 1  #图片间的间隔
     15     display_array = - np.ones((pad + display_rows * (example_height + pad),
     16                             pad + display_cols * (example_width + pad)))  #初始化图片矩阵
     17     curr_ex = 0  #当前的图片计数
     18     #将每张小图插入图片数组中
     19     for j in range(0, display_rows):
     20         for i in range(0, display_cols):
     21             if curr_ex >= m:
     22                 break
     23             max_val = np.max(abs(X[curr_ex, :]))
     24             jstart = pad + j * (example_height + pad)
     25             istart = pad + i * (example_width + pad)
     26             display_array[jstart: (jstart + example_height), istart: (istart + example_width)] = 
     27                 np.array(X[curr_ex, :]).reshape(example_height, example_width) / max_val
     28             curr_ex = curr_ex + 1
     29         if curr_ex >= m:
     30             break
     31     display_array = display_array.T
     32     plt.imshow(display_array,cmap=plt.cm.gray)
     33     plt.axis('off')
     34     plt.show()
     35 
     36 #计算hθ(z)
     37 def sigmoid(z):
     38     g = 1.0 / (1.0 + np.exp(-z))
     39     return g
     40 
     41 #计算cost
     42 def lrCostFunction(theta, X, y, lamb):
     43     theta = np.array(theta).reshape((np.size(theta), 1))
     44     m = np.size(y)
     45     h = sigmoid(np.dot(X, theta))
     46     J = 1 / m * (-np.dot(y.T, np.log(h)) - np.dot((1 - y.T), np.log(1 - h)))
     47     theta2 = theta[1:, 0]
     48     Jadd = lamb / (2 * m) * np.sum(theta2 ** 2)
     49     J = J + Jadd
     50     return J.flatten()
     51 
     52 #计算梯度
     53 def gradient(theta, X, y, lamb):
     54     theta = np.array(theta).reshape((np.size(theta), 1))
     55     m = np.size(y)
     56     h = sigmoid(np.dot(X, theta))
     57     grad = 1/m*np.dot(X.T, h - y)
     58     theta[0,0] = 0
     59     gradadd = lamb/m*theta
     60     grad = grad + gradadd
     61     return grad.flatten()
     62 
     63 #θ计算
     64 def oneVsAll(X, y, num_labels, lamb):
     65     m = np.size(X, 0)
     66     n = np.size(X, 1)
     67     all_theta = np.zeros((num_labels, n+1))
     68     one = np.ones(m)
     69     X = np.insert(X, 0, values=one, axis=1)
     70     for c in range(0, num_labels):
     71         initial_theta = np.zeros(n+1)
     72         y_t = (y==c)
     73         result = op.minimize(fun=lrCostFunction, x0=initial_theta, args=(X, y_t, lamb), method='TNC', jac=gradient)
     74         all_theta[c, :] = result.x
     75     return all_theta
     76 
     77 #计算准确率
     78 def predictOneVsAll(all_theta, X):
     79     m = np.size(X, 0)
     80     num_labels = np.size(all_theta, 0)
     81     p = np.zeros((m, 1))  #用来保存每行的最大值
     82     g = np.zeros((np.size(X, 0), num_labels))  #用来保存每次分类后的结果(一共分类了10次,每次保存到一列上)
     83     one = np.ones(m)
     84     X = np.insert(X, 0, values=one, axis=1)
     85     for c in range(0, num_labels):
     86         theta = all_theta[c, :]
     87         g[:, c] = sigmoid(np.dot(X, theta.T))
     88     p = g.argmax(axis=1)
     89     # print(p)
     90     return p.flatten()
     91 
     92 #加载数据文件
     93 data = scio.loadmat('ex3data1.mat')
     94 X = data['X']
     95 y = data['y']
     96 y = y%10  #因为数据集是考虑了matlab从1开始,把0的结果保存为了10,这里进行取余,将10变回0
     97 m = np.size(X, 0)
     98 rand_indices = np.random.randint(0,m,100)
     99 sel = X[rand_indices, :]
    100 displayData(sel)
    101 
    102 #计算θ
    103 lamb = 0.1
    104 num_labels = 10
    105 all_theta = oneVsAll(X, y, num_labels, lamb)
    106 # print(all_theta)
    107 
    108 #计算预测的准确性
    109 pred = predictOneVsAll(all_theta, X)
    110 # np.set_printoptions(threshold=np.inf)
    111 #在计算这个上遇到了一个坑:
    112 #pred输出的是[[...]]的形式,需要flatten变成1维向量,y同样用flatten变成1维向量
    113 acc = np.mean(pred == y.flatten())*100
    114 print('Training Set Accuracy:',acc,'%')

    运行结果:

    第2题

    简介:使用神经网络实现数字识别(Θ已提供)

     1 import numpy as np
     2 import scipy.io as scio
     3 import matplotlib.pyplot as plt
     4 import scipy.optimize as op
     5 
     6 #显示图片数据
     7 def displayData(X):
     8     m = np.size(X, 0)  #X的行数,即样本数量
     9     n = np.size(X, 1)  #X的列数,即单个样本大小
    10     example_width = int(np.round(np.sqrt(n)))  #单张图片宽度
    11     example_height = int(np.floor(n / example_width))  #单张图片高度
    12     display_rows = int(np.floor(np.sqrt(m)))  #显示图中,一行多少张图
    13     display_cols = int(np.ceil(m / display_rows))  #显示图中,一列多少张图片
    14     pad = 1  #图片间的间隔
    15     display_array = - np.ones((pad + display_rows * (example_height + pad),
    16                             pad + display_cols * (example_width + pad)))  #初始化图片矩阵
    17     curr_ex = 0  #当前的图片计数
    18     #将每张小图插入图片数组中
    19     for j in range(0, display_rows):
    20         for i in range(0, display_cols):
    21             if curr_ex >= m:
    22                 break
    23             max_val = np.max(abs(X[curr_ex, :]))
    24             jstart = pad + j * (example_height + pad)
    25             istart = pad + i * (example_width + pad)
    26             display_array[jstart: (jstart + example_height), istart: (istart + example_width)] = 
    27                 np.array(X[curr_ex, :]).reshape(example_height, example_width) / max_val
    28             curr_ex = curr_ex + 1
    29         if curr_ex >= m:
    30             break
    31     display_array = display_array.T
    32     plt.imshow(display_array,cmap=plt.cm.gray)
    33     plt.axis('off')
    34     plt.show()
    35 
    36 #计算hθ(z)
    37 def sigmoid(z):
    38     g = 1.0 / (1.0 + np.exp(-z))
    39     return g
    40 
    41 #实现神经网络
    42 def predict(theta1, theta2, X):
    43     m = np.size(X,0)
    44     p = np.zeros((np.size(X, 0), 1))
    45     #第二层计算
    46     one = np.ones(m)
    47     X = np.insert(X, 0, values=one, axis=1)
    48     a2 = sigmoid(np.dot(X, theta1.T))
    49     #第三层计算
    50     one = np.ones(np.size(a2,0))
    51     a2 = np.insert(a2, 0, values=one, axis=1)
    52     a3 = sigmoid(np.dot(a2, theta2.T))
    53     p = a3.argmax(axis=1) + 1  #y的值为1-10,所以此处0-9要加1
    54     return p.flatten()
    55 
    56 #读取数据文件
    57 data = scio.loadmat('ex3data1.mat')
    58 X = data['X']
    59 y = data['y']
    60 m = np.size(X, 0)
    61 rand_indices = np.random.randint(0,m,100)
    62 sel = X[rand_indices, :]
    63 # displayData(sel)
    64 
    65 theta = scio.loadmat('ex3weights.mat')
    66 theta1 = theta['Theta1']
    67 theta2 = theta['Theta2']
    68 
    69 #预测准确率
    70 pred = predict(theta1, theta2, X)
    71 acc = np.mean(pred == y.flatten())*100
    72 print('Training Set Accuracy:',acc,'%')
    73 
    74 #识别单张图片
    75 for i in range(0, m):
    76     it = np.random.randint(0, m, 1)
    77     it = it[0]
    78     displayData(X[it:it+1, :])
    79     pred = predict(theta1, theta2, X[it:it+1, :])
    80     print('Neural Network Prediction:', pred)
    81     print('input q to exit:')
    82     cin = input()
    83     if cin == 'q':
    84         break

    神经网络的矩阵表示分析:

    运行结果:

     

  • 相关阅读:
    CentOS最常用命令
    cssreset
    mysql cmd连接 乱码
    帮朋友转发招聘信息 南京知名互联网公司招聘java、测试、前端,具体私聊
    InputStream写文件出现大量NUL
    iOS app开发资料整理
    完美的视图旋转算法
    Windows上使用clang编译
    nodejs
    Rpath handling on Linux
  • 原文地址:https://www.cnblogs.com/orangecyh/p/11700022.html
Copyright © 2020-2023  润新知