最近事太多,只能下班后挤时间学习,,,缓慢更新。。
华丽的分割线--------------------------------------------------------------------------------------
极限学习机是我们实验室的元老了,是一种单隐层前馈神经网络(SLFN)学习算法。这种算法只需要设置网络的隐层节点个数,执行过程中不需要调整网络的输入权值以及隐元的偏置,并且产生唯一的最优解,因而学习速度灰常灰常快且泛化性能好。
简单来说就是两个特点:
- 输入层和隐含层的连接权值、隐含层的阈值可以随机设定,且设定完后不用再调整。
- 隐含层和输出层之间的连接权值β不需要迭代调整,而是通过解方程组方式一次性确定。
其算法主要步骤如下:
华丽的分割线----------------------------------------------------------------------------------------
用python跑一下极限学习机进行常规分类,这里不引进数据集了,自己画的散点图简单地分一下。
首先引入几个函数库
import numpy as np#引入矩阵库
from sklearn.datasets import make_classification# 主要使用sklearn随机生成数据
import matplotlib.pyplot as plt# 引入MATLAB相似绘图库,其中make_classification函数用于生成三元分类模型数据
import matplotlib as mpl#引入库,用于绘制彩色图
一、首先确定输入几个参数
# 首先确定主要输入参数
# 关键参数有n_samples(生成样本数), n_features(样本特征值), n_redundant(冗余特征数)和n_classes(输出的类别数),n_clusters_per_class(簇)
# X1为样本特征,Y1为样本类别输出, 共400个样本,每个样本2个特征,输出有2个类别,没有冗余特征,每个类别一个簇
X,Y = make_classification(n_samples=10000, n_features=2, n_redundant=0, n_clusters_per_class=1, n_classes=3)
plt.scatter(X[:,0], X[:,1], c=Y, s=3, marker='o')#plt.scatter绘制散点图函数,
#c表示颜色,s是一个实数或者是一个数组大小为(n,),marker:表示的是标记的样式,默认的是'o'。
plt.show()
绘制散点图如下所示:
二、定义我们的ELM算法
class ELM():
# 定义输入数据集X、标签Y、神经元个数m、控制参数L、训练函数TRAIN_beta
def __init__(self, X, Y, m, L):
self.X = X
self.Y = Y
self.m = m
self.L = L
self.TRAIN_beta()
def sigmoid(self, x): #使用S函数做特征映射,将输入层数据由原来空间映射到ELM的特征空间
return 1.0 / (1 + np.exp(-x))
# 定义训练函数,随机w,b 计算输出矩阵H、输出权重beta、F1输出函数
def TRAIN_beta(self):
n, d = self.X.shape#X.shape表示返回维数,返回的是一个元组; 例如y.shape[0]代表行数,y.shape[1]代表列数。
self.w = np.random.rand(d, self.m)#随机初始化
self.b = np.random.rand(1, self.m)
H = self.sigmoid(np.dot(self.X, self.w) + self.b)#使用特征映射求解输出矩阵
self.beta = np.dot(np.linalg.inv(np.identity(self.m) / self.L + np.dot(H.T, H)),#计算输出权重
np.dot(H.T, self.Y)) # 加入正则化且 n >> m
#F1 = H.dot(beta) #计算输出函数
# self.beta = np.dot(np.linalg.pinv(H), self.Y) # 不加入正则化
print('Train Finish ', self.beta.shape) #打印
打印情况:
三、函数写好,当然要测试一下
def TEST(self, x):
H = self.sigmoid(np.dot(x, self.w) + self.b) # 使用测试集计算H,其中w、b是之前随机得到的
result = np.dot(H, self.beta) #得到测试函数
print('result= ',result)
return result
打印如下:
四、使用onehot独立热编码训练,提取特征标签
Y_onehot = np.eye(3)[Y]
# 用前8000个数据训练,5000个神经元,控制参数取0.1
elm = ELM(X[:8000], Y_onehot[:8000], 5000, 0.1)
# 用后2000个数据进行测试
predict = elm.TEST(X[8000:])
predict = np.argmax(predict, axis = 1) # OneHot编码形式 取每行最大值的索引即类别
acc = np.sum(predict == Y[8000:])/2000
print('acc :', acc)
训练精度:
五、绘制分类彩图:
x_np = np.asarray(X)
y_np = np.asarray(Y)
N, M = 50, 50 # 横纵各采样多少个值
x1_min, x2_min = x_np.min(axis = 0) # 列最小值
x1_max, x2_max = x_np.max(axis = 0) # 列最大值
t1 = np.linspace(x1_min, x1_max, N) # 在min-max间线性采样
t2 = np.linspace(x2_min, x2_max, M)
x1, x2 = np.meshgrid(t1, t2) # 生成网格采样点
x_show = np.stack((x1.flat, x2.flat), axis = 1) # 测试点
y_predict = np.argmax(elm.TEST(x_show), axis = 1)
# 绘制分类图
cm_light = mpl.colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF'])
cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b'])
plt.pcolormesh(x1, x2, np.array(y_predict).reshape(x1.shape), cmap = cm_light)
plt.scatter(X[:,0], X[:,1], c=Y, s=3, marker='o')
plt.show()
分类效果如下:
完整代码如下:
#极限学习机分类练习
#作者:是最强的冰哥
import numpy as np#引入矩阵库
from sklearn.datasets import make_classification# 主要使用sklearn随机生成数据
import matplotlib.pyplot as plt# 引入MATLAB相似绘图库,make_classification生成三元分类模型数据
import matplotlib as mpl#引入库,绘制彩色图
# 首先确定主要输入参数
# 关键参数有n_samples(生成样本数), n_features(样本特征值), n_redundant(冗余特征数)和n_classes(输出的类别数),n_clusters_per_class(簇)
# X1为样本特征,Y1为样本类别输出, 共400个样本,每个样本2个特征,输出有2个类别,没有冗余特征,每个类别一个簇
X,Y = make_classification(n_samples=10000, n_features=2, n_redundant=0, n_clusters_per_class=1, n_classes=3)
plt.scatter(X[:,0], X[:,1], c=Y, s=3, marker='o')#plt.scatter绘制散点图函数,X[:,0]取二维数组所有行的第0个数据,X[:,1]取二维数组所有行的第1个数据
#c表示颜色,s是一个实数或者是一个数组大小为(n,),marker:表示的是标记的样式,默认的是'o'。
plt.show()
class ELM():
# 定义输入数据集X、标签Y、神经元个数m、控制参数L、训练函数TRAIN_beta
def __init__(self, X, Y, m, L):
self.X = X
self.Y = Y
self.m = m
self.L = L
self.TRAIN_beta()
def sigmoid(self, x): #使用S函数做特征映射,将输入层数据由原来空间映射到ELM的特征空间
return 1.0 / (1 + np.exp(-x))
# 定义训练函数,随机w,b 计算输出矩阵H、输出权重beta、F1输出函数
def TRAIN_beta(self):
n, d = self.X.shape#X.shape表示返回维数,返回的是一个元组; 例如y.shape[0]代表行数,y.shape[1]代表列数。
self.w = np.random.rand(d, self.m)#随机初始化
self.b = np.random.rand(1, self.m)
H = self.sigmoid(np.dot(self.X, self.w) + self.b)#使用特征映射求解输出矩阵
self.beta = np.dot(np.linalg.inv(np.identity(self.m) / self.L + np.dot(H.T, H)),#计算输出权重
np.dot(H.T, self.Y)) # 加入正则化且 n >> m
#F1 = H.dot(beta) #计算输出函数
# self.beta = np.dot(np.linalg.pinv(H), self.Y) # 不加入正则化
print('Train Finish ', self.beta.shape) #打印
# 测试函数,计算方法
def TEST(self, x):
H = self.sigmoid(np.dot(x, self.w) + self.b) # 使用测试集计算H,其中w、b是之前随机得到的
result = np.dot(H, self.beta) #得到测试函数
print('result= ',result)
return result
# 训练时将标签改为OneHot编码效果比较好,独热编码提取特征标签
Y_onehot = np.eye(3)[Y]
# 用前8000个数据训练,5000个神经元,控制参数取0.1
elm = ELM(X[:8000], Y_onehot[:8000], 5000, 0.1)
# 用后2000个数据进行测试
predict = elm.TEST(X[8000:])
predict = np.argmax(predict, axis = 1) # OneHot编码形式 取每行最大值的索引即类别
acc = np.sum(predict == Y[8000:])/2000
print('acc :', acc)
# 绘制分类彩图
x_np = np.asarray(X)
y_np = np.asarray(Y)
N, M = 50, 50 # 横纵各采样多少个值
x1_min, x2_min = x_np.min(axis = 0) # 列最小值
x1_max, x2_max = x_np.max(axis = 0) # 列最大值
t1 = np.linspace(x1_min, x1_max, N) # 在min-max间线性采样
t2 = np.linspace(x2_min, x2_max, M)
x1, x2 = np.meshgrid(t1, t2) # 生成网格采样点
x_show = np.stack((x1.flat, x2.flat), axis = 1) # 测试点
y_predict = np.argmax(elm.TEST(x_show), axis = 1)
# 绘制分类图
cm_light = mpl.colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF'])
cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b'])
plt.pcolormesh(x1, x2, np.array(y_predict).reshape(x1.shape), cmap = cm_light)
plt.scatter(X[:,0], X[:,1], c=Y, s=3, marker='o')
plt.show()
实验到这,后面会做一些采用大量数据集的训练进行分类或者回归,学习过程就是慢慢深入嘛~~~~