python极限学习机ELM做一个简单的分类

最近事太多,只能下班后挤时间学习,,,缓慢更新。。
华丽的分割线--------------------------------------------------------------------------------------
极限学习机是我们实验室的元老了,是一种单隐层前馈神经网络(SLFN)学习算法。这种算法只需要设置网络的隐层节点个数,执行过程中不需要调整网络的输入权值以及隐元的偏置,并且产生唯一的最优解,因而学习速度灰常灰常快且泛化性能好。

在这里插入图片描述

简单来说就是两个特点:

  1. 输入层和隐含层的连接权值、隐含层的阈值可以随机设定,且设定完后不用再调整。
  2. 隐含层和输出层之间的连接权值β不需要迭代调整,而是通过解方程组方式一次性确定。

其算法主要步骤如下:
在这里插入图片描述

华丽的分割线----------------------------------------------------------------------------------------
用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()


实验到这,后面会做一些采用大量数据集的训练进行分类或者回归,学习过程就是慢慢深入嘛~~~~

  • 9
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单Python 实现,用于使用 ELM 极限学习机进行二分类: ```python import numpy as np class ELM: def __init__(self, hidden_size): self.hidden_size = hidden_size def fit(self, X, y): # 随机生成输入层到隐藏层之间的权重 self.input_weights = np.random.normal(size=[X.shape[1], self.hidden_size]) # 计算隐藏层的输出(使用 sigmoid 函数作为激活函数) hidden = np.matmul(X, self.input_weights) self.hidden_output = 1 / (1 + np.exp(-hidden)) # 计算输出层的权重 self.output_weights = np.matmul(np.linalg.pinv(self.hidden_output), y) def predict(self, X): # 计算隐藏层的输出 hidden = np.matmul(X, self.input_weights) hidden_output = 1 / (1 + np.exp(-hidden)) # 计算输出层的输出 output = np.matmul(hidden_output, self.output_weights) # 返回预测结果(大于 0.5 为正例,小于等于 0.5 为反例) return np.round(output) # 测试代码 X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) y_train = np.array([[0], [1], [1], [0]]) X_test = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) y_test = np.array([[0], [1], [1], [0]]) elm = ELM(hidden_size=5) elm.fit(X_train, y_train) y_pred = elm.predict(X_test) print('预测结果:') print(y_pred) ``` 在上面的例子中,我们使用 sigmoid 函数作为激活函数,随机生成输入层到隐藏层之间的权重,计算隐藏层的输出,然后使用伪逆矩阵计算输出层的权重。最后,我们使用测试数据进行预测,并打印预测结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值