|
基于极限学习机的手写数字识别
运行结果视频:https://pan.baidu.com/s/1x2wGGBZ8iBIEYU2IZRv0OQ
- # -*- coding: utf-8 -*-
- """
- Created on Sun May 20 22:43:31 2018
- @author: ysw
- """
- '''https://blog.csdn.net/zxl55/article/details/79507110'''
- #from PIL import Image
- import numpy as np
- from scipy import io as spio
- from scipy import optimize
- from matplotlib import pyplot as plt
- #from sklearn import datasets
- #from sklearn.preprocessing import StandardScaler
- import time
- #引入包含数据验证方法的包
- from sklearn import metrics
- class Extreme_Learning_Machine(object):
- def __init__(self,X,y,num_hidden):
- self.data_x = np.atleast_2d(X) #判断输入训练集是否大于等于二维; 把x_train()取下来
- self.data_y = np.array(y).flatten() #a.flatten()把a放在一维数组中,不写参数默认是“C”,也就是先行后列的方式,也有“F”先列后行的方式; 把 y_train取下来
- self.num_data = len(self.data_x) #训练数据个数
- self.num_feature = self.data_x.shape[1]; #shape[] 读取矩阵的长度,比如shape[0]就是读取矩阵第一维度的长度 (120行,4列,所以shape[0]==120,shapep[1]==4)
- self.num_hidden = num_hidden; #隐藏层节点个数
- #随机生产权重(从-1,到1,生成(num_feature行,num_hidden列))
- self.w = np.random.uniform(-1, 1, (self.num_feature, self.num_hidden))
- #随机生成偏置,一个隐藏层节点对应一个偏置
- for i in range(self.num_hidden):
- b = np.random.uniform(-0.6, 0.6, (1, self.num_hidden))
- self.first_b = b
- #生成偏置矩阵,以隐藏层节点个数4为行,样本数120为列
- for i in range(self.num_data-1):
- b = np.row_stack((b, self.first_b)) #row_stack 以叠加行的方式填充数组
- self.b = b
-
- #定义sigmoid函数
- def sigmoid(self,x):
- return 1.0 / (1 + np.exp(-x))
- def train(self,x_train,y_train,classes):
- mul = np.dot(self.data_x, self.w) #输入乘以权重
- add = mul + self.b #加偏置
- H = self.sigmoid(add) #激活函数
- H_ = np.linalg.pinv(H) #求广义逆矩阵
- #print(type(H_.shape))
- #将只有一列的Label矩阵转换,例如,iris的label中共有三个值,则转换为3列,以行为单位,label值对应位置标记为1,其它位置标记为0
- self.train_y = np.zeros((self.num_data,classes)) #初始化一个120行,3列的全0矩阵
- for i in range(0,self.num_data):
- self.train_y[i,y_train[i]] = 1 #对应位置标记为1
- self.out_w = np.dot(H_,self.train_y) #求输出权重
- def predict(self,x_test):
- self.t_data = np.atleast_2d(x_test) #测试数据集
- self.num_tdata = len(self.t_data) #测试集的样本数
- self.pred_Y = np.zeros((x_test.shape[0])) #初始化
- b = self.first_b
- #扩充偏置矩阵,以隐藏层节点个数4为行,样本数30为列
- for i in range(self.num_tdata-1):
- b = np.row_stack((b, self.first_b)) #以叠加行的方式填充数组
- #预测
- self.pred_Y = np.dot(self.sigmoid(np.dot(self.t_data,self.w)+b),self.out_w)
- #取输出节点中值最大的类别作为预测值
- self.predy = []
- for i in self.pred_Y:
- L = i.tolist()
- self.predy.append(L.index(max(L)))
- def score(self,y_test):
- print("准确率:")
- #使用准确率方法验证
- print(metrics.accuracy_score(y_true=y_test, y_pred=self.predy))
- # 显示100个数字
- def display_data(imgData):
- sum = 0
- '''
- 显示100个数(若是一个一个绘制将会非常慢,可以将要画的数字整理好,放到一个矩阵中,显示这个矩阵即可)
- - 初始化一个二维数组
- - 将每行的数据调整成图像的矩阵,放进二维数组
- - 显示即可
- '''
- m,n = imgData.shape
- width = np.int32(np.round(np.sqrt(n)))
- height = np.int32(n/width);
- rows_count = np.int32(np.floor(np.sqrt(m)))
- cols_count = np.int32(np.ceil(m/rows_count))
- pad = 1
- display_array = -np.ones((pad+rows_count*(height+pad),pad+cols_count*(width+pad)))
- for i in range(rows_count):
- for j in range(cols_count):
- if sum >= m: #超过了行数,退出当前循环
- break;
- 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中需要指定,默认以行
- sum += 1
- if sum >= m: #超过了行数,退出当前循环
- break;
-
- # plt.imshow(np.transpose(display_array),cmap='gray') #显示灰度图像
- plt.imshow(display_array, cmap='gray') #显示灰度图像
- plt.axis('off')
- plt.show()
- # 加载mat文件
- def loadmat_data(fileName):
- return spio.loadmat(fileName)
- if __name__ == "__main__":
- # 加载数据
- data_img = loadmat_data("data_digits.mat")
- X = data_img['X']
- y = data_img['y']
-
- m,n = X.shape
- ## 随机显示几行数据
- rand_indices = [t for t in [np.random.randint(x-x, m) for x in range(100)]] # 生成100个0-m的随机数
- display_data(X[rand_indices,:]) # 显示100个数字
-
- input_layer_size = 400;
- num_hidden = 25;
- classes = 10;
-
- start = time.time()
- ELM = Extreme_Learning_Machine(X, y, num_hidden) #训练数据集,训练集的label,隐藏层节点个数
- ELM.train(X, y, classes)
- print ('\n')
- print ('\n')
- print ( '执行时间:' )
- print ( time.time()-start )
- '''预测'''
- ELM.predict(X)
- # ELM.score(y)
-
- # 计算得分
- p = ELM.predy;
- # print ('预测准确度为:')
- # print(metrics.accuracy_score(y_true=y, y_pred=p))
- p = np.array(p)
- p = np.reshape(p, [-1, 1] )
- print ('预测准确度为:')
- print ( np.mean(np.float64(p == y.reshape(-1,1))*100) )
- res = np.hstack((p,y.reshape(-1,1)))
- np.savetxt("predict.csv", res, delimiter=',')
复制代码 百度网盘链接:链接:https://pan.baidu.com/s/15MPObcNGKfvoYTXE9woG8w 密码:u0na
|
|