一、对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在测试时要保持一致。因为训练完毕之后代表着整个模型已经建立起来,里面的权重和参数不能更改,更改之后将变得无意义。
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))
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数据集下载链接:点击打开链接
开了一个技术交流的公众号,里面记录一些在学习有关深度学习,推荐系统与机器学习过程中的笔记与心得,欢迎关注~