【极限学习机ELM与DELM——python实现与应用】

一、对ELM算法与DELM算法的理解

ELM算法和神经网络算法我认为最大的区别在于:ELM不需要进行迭代,而是一次性通过标签计算出最后一层神经元的权重。而神经网络是通过梯度下降的方法,不断的根据loss值更新权重值。

因此我认为ELM算法不适合构造出更深的网络结构,但是减少了计算量,少了机器开销。而DELM相对于ELM加入了正则项的限制,防止过拟合。

二、算法描述(以ELM算法为例)

1.     通过训练数据中的特征矩阵x得到h(x的行数代表着样本个数,列数代表着特征个数),计算公式为 ,其中W与b的值是随机初始化的,w中的行数和训练集的特征数一致,列数与神经元的个数一致。b的列数与神经元的个数一致,行数与样本数的个数一致。随机初始化W时,每个位置的值都不一样,而随机初始化b时,每一列的b值必须保持相同,因为b的列数代表着神经元的个数。

2.     通过训练数据中的标签t得到β,计算公式为,此时模型训练完毕

3.     对于分类问题,我们需要将标签转成独热编码

4.     测试时,将测试集中的x带入此公式即可,其中W,b和β都已知。

5.     需要注意的是测试集中的x的行数不一样,因此在利用b时一定要保持维度一致,b矩阵的意义是每一列的b值一样,因为列数代表神经元的个数,因此根据此规律随意扩展b的行数,使其与测试集的行数一致。

6.     除此之外,需要注意的是在训练时初始化的随机权重w和b在测试时要保持一致。因为训练完毕之后代表着整个模型已经建立起来,里面的权重和参数不能更改,更改之后将变得无意义。

 

 

三、编程实现ELM与DELM并对鸢尾花进行分类

 

ELM程序:
 
import numpy as np
from sklearn.preprocessing import OneHotEncoder,LabelEncoder
import numpy as np
from sklearn.datasets import load_iris  #数据集
from sklearn.model_selection import train_test_split  #数据集的分割函数
from sklearn.preprocessing import StandardScaler      #数据预处理
from sklearn import metrics
from sklearn.model_selection import cross_validate
from sklearn import metrics

class HiddenLayer:
    def __init__(self,x,num):
        row = x.shape[0]
        columns = x.shape[1]
        rnd = np.random.RandomState(4444)
        self.w = rnd.uniform(-1,1,(columns,num))
        self.b = np.zeros([row,num],dtype=float)
        for i in range(num):
            rand_b = rnd.uniform(-0.4,0.4)
            for j in range(row):
                self.b[j,i] = rand_b
        h = self.sigmoid(np.dot(x,self.w)+self.b)
        self.H_ = np.linalg.pinv(h)
        # print(self.H_.shape)
    def sigmoid(self,x):
        return 1.0 / (1 + np.exp(-x))

    def regressor_train(self,T):
        T = T.reshape(-1,1)
        self.beta = np.dot(self.H_,T)
        return self.beta
    def classifisor_train(self,T):
        en_one = OneHotEncoder()
        T = en_one.fit_transform(T.reshape(-1,1)).toarray() #独热编码之后一定要用toarray()转换成正常的数组
        # T = np.asarray(T)
        print(self.H_.shape)
        print(T.shape)
        self.beta = np.dot(self.H_,T)
        print(self.beta.shape)
        return self.beta
    def regressor_test(self,test_x):
        b_row = test_x.shape[0]
        h = self.sigmoid(np.dot(test_x,self.w)+self.b[:b_row,:])
        result = np.dot(h,self.beta)
        return result
    def classifisor_test(self,test_x):
        b_row = test_x.shape[0]
        h = self.sigmoid(np.dot(test_x,self.w)+self.b[:b_row,:])
        result = np.dot(h,self.beta)
        result = [item.tolist().index(max(item.tolist())) for item in result]
        return result



stdsc = StandardScaler()
iris = load_iris()
x,y = stdsc.fit_transform(iris.data),iris.target
x_train, x_test, y_train, y_test = train_test_split(x , y, test_size=0.2, random_state=0)

a = HiddenLayer(x_train,20)
a.classifisor_train(y_train)
result = a.classifisor_test(x_test)


print(result)
print(metrics.accuracy_score(y_test,result))

DELM核心程序:

 
import numpy as np
from sklearn.preprocessing import OneHotEncoder,LabelEncoder
import numpy as np
from sklearn.datasets import load_iris  #数据集
from sklearn.model_selection import train_test_split  #数据集的分割函数
from sklearn.preprocessing import StandardScaler      #数据预处理
from sklearn import metrics
from sklearn.model_selection import cross_validate
#引入包含数据验证方法的包
from sklearn import metrics

class HiddenLayer:
    def __init__(self,x,num):
        row = x.shape[0]
        columns = x.shape[1]
        rnd = np.random.RandomState(4444)
        self.w = rnd.uniform(-1,1,(columns,num))
        self.b = np.zeros([row,num],dtype=float)
        for i in range(num):
            rand_b = rnd.uniform(-0.4,0.4)
            for j in range(row):
                self.b[j,i] = rand_b
        self.h = self.sigmoid(np.dot(x,self.w)+self.b)
        self.H_ = np.linalg.pinv(self.h)
        # print(self.H_.shape)
    def sigmoid(self,x):
        return 1.0 / (1 + np.exp(-x))

    def regressor_train(self,T):
        C = 2
        I = len(T)
        sub_former = np.dot(np.transpose(self.h), self.h) + I / C
        all_m = np.dot(np.linalg.pinv(sub_former),np.transpose(self.h))
        T = T.reshape(-1,1)
        self.beta = np.dot(all_m,T)
        return self.beta
    def classifisor_train(self,T):
        en_one = OneHotEncoder()
        T = en_one.fit_transform(T.reshape(-1,1)).toarray() #独热编码之后一定要用toarray()转换成正常的数组
        C = 3
        I = len(T)
        sub_former = np.dot(np.transpose(self.h), self.h) + I / C
        all_m = np.dot(np.linalg.pinv(sub_former), np.transpose(self.h))
        self.beta = np.dot(all_m, T)
        return self.beta
    def regressor_test(self,test_x):
        b_row = test_x.shape[0]
        h = self.sigmoid(np.dot(test_x,self.w)+self.b[:b_row,:])
        result = np.dot(h,self.beta)
        return result
    def classifisor_test(self,test_x):
        b_row = test_x.shape[0]
        h = self.sigmoid(np.dot(test_x,self.w)+self.b[:b_row,:])
        result = np.dot(h,self.beta)
        result = [item.tolist().index(max(item.tolist())) for item in result]
        return result



stdsc = StandardScaler()
iris = load_iris()
x,y = stdsc.fit_transform(iris.data),iris.target
x_train, x_test, y_train, y_test = train_test_split(x , y, test_size=0.2, random_state=0)

a = HiddenLayer(x_train,20)
a.classifisor_train(y_train)

result = a.classifisor_test(x_test)

print(result)
print(metrics.accuracy_score(y_test,result))

利用ELM和DELM对数据进行回归:
 
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from ELM_myself import HiddenLayer
# from DELM_myself import HiddenLayer
data = pd.read_csv('r_test.csv')
x = data.x.values.reshape(-1,1)
y = data.y.values.reshape(-1,1)

my_EML = HiddenLayer(x,5)
my_EML.regressor_train(y)
x_test = np.linspace(0.9,5.02,100).reshape(-1,1)
y_test = my_EML.regressor_test(x_test)
plt.plot(x_test,y_test)
plt.scatter(x,y)
plt.title('EML_regress')
plt.xlabel('x')
plt.ylabel('y')
plt.show()

# my_DEML = HiddenLayer(x,10)
# my_DEML.regressor_train(y)
# x_test = np.linspace(0.9,5.02,100).reshape(-1,1)
# y_test = my_DEML.regressor_test(x_test)
# plt.plot(x_test,y_test)
# plt.scatter(x,y)
# plt.title('DEML_regress')
# plt.xlabel('x')
# plt.ylabel('y')
# plt.show()

r_test.csv数据集下载链接:点击打开链接

 

开了一个技术交流的公众号,里面记录一些在学习有关深度学习,推荐系统与机器学习过程中的笔记与心得,欢迎关注~

                                                                     

 

  • 23
    点赞
  • 226
    收藏
    觉得还不错? 一键收藏
  • 49
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 49
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值