ELM算法

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》

 

 

  • 8
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值