1. ELM算法思想
前馈神经网络的学习速度一般比较慢,这是近几十年来应用神经网络的一个主要瓶颈问题。其背后的两个关键原因可能是:(1) 基于梯度下降的优化神经网络;(2)对网络的所有参数进行迭代调整。极限学习机与传统的学习算法不同,它随机选择隐藏节点、随机确定隐层权重参数和偏差,以解析计算的方式确定输出层权值。理论上,该算法以极快的学习速度提供了良好的泛化性能。在实际应用中,该算法在大多数情况下都能产生良好的泛化性能,比传统的前馈神经网络学习算法学习速度快数千倍。
2. 推导过程
3. 代码实现
# -*-coding:utf-8 -*-
import numpy as np
def load_Iris_set(set_path):
with open(set_path,'r',encoding='utf-8') as txt:
lines = [line.strip().split('\t') for line in txt.readlines()]
lines = [line[0].split(',') for line in lines]
X = []
Y = []
for line in lines:
data = line[:-1]
label = line[-1]
X.append([float(x) for x in data])
if label=="Iris-setosa":
Y.extend([1])
elif label=="Iris-versicolor":
Y.extend([2])
else:
Y.extend([3])
return np.array(X),np.array(Y)
class ELM:
def __init__(self,node_num,rand_seed=None):
self.node_num = node_num
self.rand_seed = rand_seed
self.w1 = None
self.w2 = None
def sigmoid(self,x):
return 1./(1. + np.exp(-x))
def label_to_vector(self,c,label):
return [-1 if i!=label else 1 for i in range(1,c+1)]
def hid_out(self,X):
if self.rand_seed:
np.random.seed(self.rand_seed)
else:
np.random.seed()
# add bias
self.w1 = np.random.normal(size=(np.shape(X)[1]+1, self.node_num))
# add col
X = np.c_[X,np.ones(X.shape[0])]
return self.sigmoid(np.dot(X,self.w1))
def fit(self, X, Y):
# 将标签标量转化为向量
c = np.max(Y)
if c!=1:
Y = np.array([self.label_to_vector(c,i) for i in Y])
H = self.hid_out(X)
self.w2 = np.dot(np.linalg.pinv(H),Y)
return self
def score(self,X,Y):
H_ = self.hid_out(X)
y_ = np.dot(H_,self.w2)
y_pre = np.argmax(y_,axis=1) + np.ones(X.shape[0])
count = 0.
for i in range(Y.shape[0]):
if y_pre[i]==Y[i]:
count +=1
return count/np.float(Y.shape[0])
def predict(self,X):
H_ = self.hid_out(X)
y_pre = np.dot(H_,self.w2)
return np.argmax(y_pre,axis=1) + np.ones(X.shape[0])
if __name__=="__main__":
set_path = "Iris.txt"
X,Y = load_Iris_set(set_path)
elm = ELM(140,1)
elm.fit(X,Y)
print(elm.score(X,Y))
参考资料:
1. 《Extreme learning machine: Theory and applications》