Hello Mat

 找回密码
 立即注册
查看: 8555|回复: 1

基于极限学习机的手写数字识别

[复制链接]

1323

主题

1551

帖子

0

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22647
发表于 2018-5-27 22:07:10 | 显示全部楼层 |阅读模式
基于极限学习机的手写数字识别
运行结果视频:https://pan.baidu.com/s/1x2wGGBZ8iBIEYU2IZRv0OQ

  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Sun May 20 22:43:31 2018

  4. @author: ysw
  5. """
  6. '''https://blog.csdn.net/zxl55/article/details/79507110'''
  7. #from PIL import Image
  8. import numpy as np
  9. from scipy import io as spio
  10. from scipy import optimize
  11. from matplotlib import pyplot as plt
  12. #from sklearn import datasets
  13. #from sklearn.preprocessing import StandardScaler
  14. import time

  15. #引入包含数据验证方法的包
  16. from sklearn import metrics

  17. class Extreme_Learning_Machine(object):

  18.     def __init__(self,X,y,num_hidden):
  19.         self.data_x = np.atleast_2d(X)       #判断输入训练集是否大于等于二维; 把x_train()取下来
  20.         self.data_y = np.array(y).flatten()  #a.flatten()把a放在一维数组中,不写参数默认是“C”,也就是先行后列的方式,也有“F”先列后行的方式; 把 y_train取下来
  21.         self.num_data = len(self.data_x)     #训练数据个数
  22.         self.num_feature = self.data_x.shape[1];  #shape[] 读取矩阵的长度,比如shape[0]就是读取矩阵第一维度的长度 (120行,4列,所以shape[0]==120,shapep[1]==4)
  23.         self.num_hidden = num_hidden;  #隐藏层节点个数

  24.         #随机生产权重(从-1,到1,生成(num_feature行,num_hidden列))
  25.         self.w = np.random.uniform(-1, 1, (self.num_feature, self.num_hidden))

  26.         #随机生成偏置,一个隐藏层节点对应一个偏置
  27.         for i in range(self.num_hidden):
  28.             b = np.random.uniform(-0.6, 0.6, (1, self.num_hidden))
  29.             self.first_b = b

  30.         #生成偏置矩阵,以隐藏层节点个数4为行,样本数120为列
  31.         for i in range(self.num_data-1):
  32.             b = np.row_stack((b, self.first_b))  #row_stack 以叠加行的方式填充数组
  33.         self.b = b
  34.         
  35.     #定义sigmoid函数  
  36.     def sigmoid(self,x):
  37.         return 1.0 / (1 + np.exp(-x))

  38.     def train(self,x_train,y_train,classes):
  39.         mul = np.dot(self.data_x, self.w)    #输入乘以权重
  40.         add = mul + self.b                        #加偏置
  41.         H = self.sigmoid(add)                #激活函数

  42.         H_ = np.linalg.pinv(H)               #求广义逆矩阵
  43.         #print(type(H_.shape))

  44.         #将只有一列的Label矩阵转换,例如,iris的label中共有三个值,则转换为3列,以行为单位,label值对应位置标记为1,其它位置标记为0
  45.         self.train_y = np.zeros((self.num_data,classes))  #初始化一个120行,3列的全0矩阵
  46.         for i in range(0,self.num_data):
  47.             self.train_y[i,y_train[i]] = 1   #对应位置标记为1

  48.         self.out_w = np.dot(H_,self.train_y)  #求输出权重

  49.     def predict(self,x_test):
  50.         self.t_data = np.atleast_2d(x_test)    #测试数据集
  51.         self.num_tdata = len(self.t_data)      #测试集的样本数
  52.         self.pred_Y = np.zeros((x_test.shape[0]))  #初始化

  53.         b = self.first_b

  54.         #扩充偏置矩阵,以隐藏层节点个数4为行,样本数30为列
  55.         for i in range(self.num_tdata-1):
  56.             b = np.row_stack((b, self.first_b))  #以叠加行的方式填充数组

  57.          #预测  
  58.         self.pred_Y = np.dot(self.sigmoid(np.dot(self.t_data,self.w)+b),self.out_w)

  59.         #取输出节点中值最大的类别作为预测值
  60.         self.predy = []
  61.         for i in self.pred_Y:
  62.             L = i.tolist()
  63.             self.predy.append(L.index(max(L)))  

  64.     def score(self,y_test):
  65.         print("准确率:")
  66.         #使用准确率方法验证
  67.         print(metrics.accuracy_score(y_true=y_test, y_pred=self.predy))

  68. # 显示100个数字
  69. def display_data(imgData):
  70.     sum = 0
  71.     '''
  72.     显示100个数(若是一个一个绘制将会非常慢,可以将要画的数字整理好,放到一个矩阵中,显示这个矩阵即可)
  73.     - 初始化一个二维数组
  74.     - 将每行的数据调整成图像的矩阵,放进二维数组
  75.     - 显示即可
  76.     '''
  77.     m,n = imgData.shape
  78.     width = np.int32(np.round(np.sqrt(n)))
  79.     height = np.int32(n/width);
  80.     rows_count = np.int32(np.floor(np.sqrt(m)))
  81.     cols_count = np.int32(np.ceil(m/rows_count))
  82.     pad = 1
  83.     display_array = -np.ones((pad+rows_count*(height+pad),pad+cols_count*(width+pad)))
  84.     for i in range(rows_count):
  85.         for j in range(cols_count):
  86.             if sum >= m: #超过了行数,退出当前循环
  87.                 break;
  88.             display_array[pad+i*(height+pad):pad+i*(height+pad)+height,pad+j*(width+pad):pad+j*(width+pad)+width] = imgData[sum,:].reshape(height,width,order="F")    # order=F指定以列优先,在matlab中是这样的,python中需要指定,默认以行
  89.             sum += 1
  90.         if sum >= m:  #超过了行数,退出当前循环
  91.             break;
  92.             
  93. #    plt.imshow(np.transpose(display_array),cmap='gray')   #显示灰度图像
  94.     plt.imshow(display_array, cmap='gray')   #显示灰度图像
  95.     plt.axis('off')
  96.     plt.show()

  97. # 加载mat文件
  98. def loadmat_data(fileName):
  99.     return spio.loadmat(fileName)

  100. if __name__ == "__main__":
  101.     # 加载数据
  102.     data_img = loadmat_data("data_digits.mat")
  103.     X = data_img['X']
  104.     y = data_img['y']  
  105.    
  106.     m,n = X.shape
  107.     ## 随机显示几行数据
  108.     rand_indices = [t for t in [np.random.randint(x-x, m) for x in range(100)]]  # 生成100个0-m的随机数
  109.     display_data(X[rand_indices,:])     # 显示100个数字   
  110.      
  111.     input_layer_size = 400;
  112.     num_hidden = 25;
  113.     classes = 10;
  114.    
  115.     start = time.time()
  116.     ELM = Extreme_Learning_Machine(X, y, num_hidden)   #训练数据集,训练集的label,隐藏层节点个数
  117.     ELM.train(X, y, classes)
  118.     print ('\n')
  119.     print ('\n')
  120.     print ( '执行时间:' )
  121.     print ( time.time()-start )
  122.     '''预测'''
  123.     ELM.predict(X)
  124. #    ELM.score(y)
  125.    
  126.     # 计算得分
  127.     p = ELM.predy;
  128. #    print ('预测准确度为:')
  129. #    print(metrics.accuracy_score(y_true=y, y_pred=p))
  130.     p = np.array(p)
  131.     p = np.reshape(p, [-1, 1] )
  132.     print ('预测准确度为:')
  133.     print ( np.mean(np.float64(p == y.reshape(-1,1))*100) )   
  134.     res = np.hstack((p,y.reshape(-1,1)))
  135.     np.savetxt("predict.csv", res, delimiter=',')

复制代码
百度网盘链接:链接:https://pan.baidu.com/s/15MPObcNGKfvoYTXE9woG8w 密码:u0na



算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复

使用道具 举报

0

主题

3

帖子

1

金钱

新手上路

Rank: 1

积分
4
发表于 2020-5-25 22:46:18 | 显示全部楼层
谢谢楼主分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Python|Opencv|MATLAB|Halcom.cn ( 蜀ICP备16027072号 )

GMT+8, 2024-11-25 13:38 , Processed in 0.220564 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表