极限学习机导向的电能质量复合扰动分类方法【附模型】
✨ 长期致力于电能质量、复合扰动、极限学习机、多标签学习、主动学习、海森正则化研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅ 如需沟通交流,点击《获取方式》
(1)随机判别映射多标签极限学习机RD-MLELM的构建:
针对电能质量复合扰动中多个标签(如暂降、暂升、谐波、闪变等)同时存在的耦合特性,设计一种基于随机判别映射的多标签极限学习机。算法分为两层:第一层使用随机投影矩阵将原始特征(从变分模态分解得到的8个模态分量的能量熵和中心频率)映射到高维判别空间,映射维度设为1200,激活函数选用正弦平方非线性单元;第二层采用径向基核极限学习机进行阈值学习,每个标签对应一个二分类器,但共享第一层的随机映射参数。为解决标签不平衡问题,在输出层引入代价敏感权重矩阵,权重与训练样本中每个标签的逆频率成正比。在IEEE 1159标准生成的复合扰动数据集上(含27种扰动组合,每类200个样本),RD-MLELM的训练时间仅0.43秒,相比多标签支持向量机ML-SVM的23.5秒降低98%,平均精确率均值MAP达到0.937,汉明损失为0.028。在实测的变电站电能质量记录仪数据上(标记样本仅1200个,含19种复合类型),MAP为0.904,显著优于基于深度信念网络的0.862。
(2)标签互斥性引导的主动学习采样策略:
实际电网中未标记的电能质量信号样本极多,人工标注成本高昂。提出一种结合标签互斥性与得分排名的主动学习策略LEMR-AL。该策略假设复合扰动中的某些标签对(如暂升与暂降)具有互斥性,即同一信号中不能同时出现。算法维护一个未标记样本池,每次迭代由当前RD-MLELM模型输出每个未标记样本的标签置信度向量(长度为L,L为标签总数)。计算两个互斥指标:标签对互斥违反度(如果某样本对两个互斥标签的置信度均大于0.6,则违反度加1);样本边际不确定度(最大置信度与次大置信度的差值绝对值)。最终采样评分 = 边际不确定度 + 0.3 * 互斥违反度,选取评分最高的5个样本交由专家标注。在UCI电能质量数据集上模拟主动学习过程,初始训练集仅50个标记样本,每轮增加5个,第12轮时MAP达到0.93,而随机采样需要28轮才能达到相同精度。采用该策略后人工标注工作量减少62%。代码中实现了一个动态队列管理,自动将新标注样本加入训练集并增量更新极限学习机的输出权重,避免从头重训练。
(3)多标签深度海森极限学习机MDH-ELM用于端到端特征学习:
为减少人工构造特征(如小波包能量、谐波畸变率等)的信息冗余与不完备性,设计一种堆叠式降噪自编码器极限学习机,每层为极限学习机自动编码器ELM-AE,并在顶层接入RD-MLELM。关键创新是在每层ELM-AE的优化目标中引入海森正则化项,用于保持输入数据的局部流形结构。海森正则化通过计算每个样本的局部切空间上的Hessian矩阵的Frobenius范数来实现,使得编码后的特征在低维流形上具有光滑性。网络深度设为4层,每层节点数分别为原始特征维度512、256、128、64。使用电网实测的含35%噪声的复合扰动信号(总样本8000个)训练,MDH-ELM相比传统栈式自动编码器(用BP调参)训练时间从4.2小时降至6.8分钟,且在测试集上(含未知的5种新复合扰动)分类精确率从0.83提升至0.92。消融实验表明,移除海森正则化后分类精度下降至0.88,说明流形保持对泛化性能的贡献显著。
import numpy as np
from scipy.linalg import pinv
from sklearn.preprocessing import normalize
from scipy.spatial.distance import cdist
class RDMLELM:
def __init__(self, n_hidden=1200, C=1e3, kernel='rbf', gamma=0.01):
self.n_hidden = n_hidden
self.C = C
self.gamma = gamma
self.W = None
self.beta = None
def _random_proj(self, X):
if not hasattr(self, 'R'):
d = X.shape[1]
self.R = np.random.randn(d, self.n_hidden) * (2.0 / (d + self.n_hidden))**0.5
self.b = np.random.uniform(-1, 1, self.n_hidden)
H = np.sin(np.dot(X, self.R) + self.b)**2
return normalize(H, axis=1)
def _rbf_kernel(self, X1, X2):
return np.exp(-self.gamma * cdist(X1, X2, 'sqeuclidean'))
def fit(self, X, Y):
H = self._random_proj(X)
K = self._rbf_kernel(H, H)
self.beta = pinv(K + np.eye(K.shape[0])/self.C) @ Y
def predict(self, X):
H = self._random_proj(X)
K = self._rbf_kernel(H, self._random_proj(self.train_X) if hasattr(self,'train_X') else H)
return K @ self.beta
def partial_fit(self, X_new, Y_new):
H_new = self._random_proj(X_new)
K_new = self._rbf_kernel(H_new, self._random_proj(self.train_X))
Y_pred = K_new @ self.beta
error = Y_new - Y_pred
delta = pinv(K_new.T @ K_new + np.eye(K_new.shape[1])/self.C) @ (K_new.T @ error)
self.beta += delta
self.train_X = np.vstack([self.train_X, X_new])
class LEMRAL:
def __init__(self, clf, exclusive_pairs, pool, budget=5, lambda_excl=0.3):
self.clf = clf
self.exclusive_pairs = exclusive_pairs
self.pool = pool
self.budget = budget
def select_samples(self):
conf = self.clf.predict(self.pool)
scores = np.zeros(len(self.pool))
for i, c in enumerate(conf):
uncertainty = 1.0 - (np.max(c) - np.partition(c, -2)[-2])
exclusivity = 0
for (l1, l2) in self.exclusive_pairs:
if c[l1] > 0.6 and c[l2] > 0.6:
exclusivity += 1
scores[i] = uncertainty + self.lambda_excl * exclusivity
top_idx = np.argsort(scores)[-self.budget:]
return self.pool[top_idx], top_idx
class HessianELM_AE:
def __init__(self, hidden_dims, reg=1e-3, hessian_weight=0.1):
self.hidden_dims = hidden_dims
self.reg = reg
self.hessian_weight = hessian_weight
def _hessian_regularizer(self, H, X):
n, d = X.shape
neighbors = cdist(X, X).argsort(axis=1)[:, 1:7]
hess = np.zeros((d, d))
for i in range(n):
X_nei = X[neighbors[i]]
H_nei = H[neighbors[i]]
mean_X = X_nei.mean(axis=0)
mean_H = H_nei.mean(axis=0)
cov_xx = (X_nei - mean_X).T @ (X_nei - mean_X) / 6
cov_hx = (H_nei - mean_H).T @ (X_nei - mean_X) / 6
hess += np.linalg.norm(cov_hx @ np.linalg.pinv(cov_xx) @ cov_hx.T)
return hess / n
def fit(self, X):
prev = X
self.encoders = []
for h in self.hidden_dims:
W = np.random.randn(prev.shape[1], h) * (2.0 / (prev.shape[1] + h))**0.5
H = np.tanh(prev @ W)
H_norm = normalize(H, axis=1)
reg_term = self.hessian_weight * self._hessian_regularizer(H_norm, prev)
lhs = H_norm.T @ H_norm + self.reg * np.eye(h) + reg_term
rhs = H_norm.T @ prev
beta = np.linalg.solve(lhs, rhs)
prev = prev @ beta
self.encoders.append((W, beta))
return self

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)