基于支持向量机的谐波分析研究与实现
前言
??针对传统算法分析谐波问题中存在的一些弊端,本文引入了基于统计学习理论的支持向量机学习算法,利用支持向量机分析电力系统谐波问题。
一、支持向量机分析电力谐波的原理
??就我国电力系统的相关标准而言,理想状态下的电压、电流信号均为标准的余弦信号,频率为标称值 50Hz。但实际状态下,电力系统中必然会存在各次谐波或间谐波以及噪声信号,这些分量的存在使得实际的电压、电流信号不再是标准的余弦信号,且实际基波频率与标称频率之间也会出现一定程度的偏差。但就一般情况而言可以假设电力系统的信号模型为:
????
y
(
t
)
=
∑
k
=
1
N
a
k
cos
?
(
2
π
f
k
t
?
φ
k
)
+
e
(
t
)
y(t) = \sum\limits_{k = 1}^N {{a_k}\cos (2\pi {f_k}t - {\varphi _k})} + e(t)
y(t)=k=1∑N?ak?cos(2πfk?t?φk?)+e(t) 式中,
N
N
N 表示信号中谐波及间谐波含量;
a
k
a_k
ak?、
f
f
f、
k
k
k、
φ
φ
φ、
k
k
k分别表示第
k
k
k 次信号分量的幅值、频率及初相位;
e
(
t
)
e(t)
e(t)表示信号分析过程中的误差量。 ??对于电力系统相关信号的分析,一般是先对其进行离散化处理。参照经典傅里叶算法的离散化过程,可得以下离散形式的电力信号表达式 ????
y
m
=
∑
k
=
1
N
a
k
cos
?
(
ω
k
t
m
?
φ
k
)
+
e
(
t
m
)
{y_m} = \sum\limits_{k = 1}^N {{a_k}\cos ({\omega _k}{t_m} - {\varphi _k})} + e({t_m})
ym?=k=1∑N?ak?cos(ωk?tm??φk?)+e(tm?) 式中,
m
=
1
,
2
,
?
?
?
,
N
m=1,2,???,N
m=1,2,???,N,表示信号采集过程中采样点的个数;
e
(
t
i
)
e(t_i)
e(ti?)表示
t
i
t_ i
ti?时刻信号与实际信号的误差量;其余信号含义不变。 ??最终将信号在时域和频域之间的转换,得到。 ????
y
m
=
∑
k
=
1
N
c
k
cos
?
(
ω
k
t
m
)
+
d
k
sin
?
(
ω
k
t
m
)
)
+
e
(
t
m
)
{y_m} = \sum\limits_{k = 1}^N {{c_k}\cos ({\omega _k}{t_m}) + {d_k}\sin ({\omega _k}{t_m}))} + e({t_m})
ym?=k=1∑N?ck?cos(ωk?tm?)+dk?sin(ωk?tm?))+e(tm?) 求解式中的
c
k
c_k
ck?、
d
k
d_k
dk?可以采用多种不同方式,但大部分传统求解方式共有的缺陷就是对于信号中的异常值过于敏感,这使得算法分析低信噪比信号的性能很差,从而不能稳健的分析电力系统中的电压、电流信息。 ??随着支持向量机理论在不敏感损失函数 ε 方面的优化,该算法具备了良好的线性或者非线性回归估计方面的分析能力。在此基础上运用支持向量机回归估计理论来推导
c
k
c_k
ck?、
d
k
d_k
dk?的求解步骤。 支持向量机理论通过引入损失函数来提高算法的稳健性 ??设模型的输入为
X
X
X
X
i
=
[
cos
?
(
ω
1
t
i
)
,
?
?
,
cos
?
(
ω
N
t
i
)
,
?
?
,
sin
?
(
ω
1
t
i
)
,
sin
?
(
ω
N
t
i
)
{X_i} = [\cos ({\omega _1}{t_i}), \cdots ,\cos ({\omega _N}{t_i}), \cdots ,\sin ({\omega _1}{t_i}),\sin ({\omega _N}{t_i})
Xi?=[cos(ω1?ti?),?,cos(ωN?ti?),?,sin(ω1?ti?),sin(ωN?ti?)
??设定
ω
\omega
ω为: ????
ω
=
[
c
1
,
?
?
,
c
N
,
?
?
,
d
1
,
?
?
,
d
N
]
\omega = [{c_1}, \cdots ,{c_N}, \cdots ,{d_1}, \cdots ,{d_N}]
ω=[c1?,?,cN?,?,d1?,?,dN?] 综上分析,电力信号可以表示为: ????
y
i
=
ω
X
i
+
e
(
t
i
)
{y_i} = \omega {X_i} + e({t_i})
yi?=ωXi?+e(ti?) ??其中幅值和相位的转换关系为 ????
a
k
2
=
c
k
2
+
d
k
2
φ
k
=
a
r
c
tan
?
(
c
k
/
d
k
)
\begin{array}{l} a_k^2 = c_k^2 + d_k^2\\ {\varphi _k} = arc\tan ({c_k}/{d_k}) \end{array}
ak2?=ck2?+dk2?φk?=arctan(ck?/dk?)? ??依照支持向量及相关理论,可将式中所描述的电力信号通过
X
i
X_i
Xi?映射到高维空间,电力系统信号相关参数的求解问题,转化为求解
ω
\omega
ω的问题。
二、基于 SVM 的电力谐波分析与仿真
??综合上述分析,在此利用支持向量机的相关理论与公式推导,通过求解
c
k
c_k
ck?、
d
k
d_k
dk?来提取电力信号中包含的谐波或者间谐波分量。归纳上述分析步骤,可得支持向量机分析电力系统信号的一般步骤: (1)设置适当的采样频率及采样点数对电力系统信号进行采样,得出待分析的时间序列
(
t
i
,
y
i
)
(t_i,y_i)
(ti?,yi?); (2)利用合适的核函数将时间序列映射到高维空间系统; (3)选择恰当的支持向量机控制参数; (4)求解二次规划问题,得出拉格朗日乘子
α
α
α 的表达式; (5)运用表达式分析计算待分析电力系统信号的谐波或者间谐波信号的幅值与相位信息,从而完成信号分析。 ??依据电力系统信号模型,选图所示的信号,在此为验证非同步采样特性,现将基频改为 49Hz 来实际测试 SVM 算法,并与 FFT 算法进行对比。 ??原始信号如图所示, ??提取傅里叶变换得到 ??利用SVR对数据进行拟合,得到拟合的结果如图所示,可以看出,完全拟合, ??然后就是求解对应的拟合系数
ω
\omega
ω 利用工具箱linsvm,然后提取其中系数,代码如下
%libsvm中间参数探索@20180704
clear all;close all;clc;
[y, x] = libsvmread('heart_scale');
x = full(x);
%SVM训练
model = svmtrain(y, x, '-t 0 -c 1');
[predict_label, accuracy, dec_values] = svmpredict(y, x, model);
%支持向量索引(Support Vectors Index)
SVs_idx = model.sv_indices;
%支持向量特征属性和类别属性
x_SVs = x(SVs_idx,:);% or use: SVs=full(model.SVs);
y_SVs = y(SVs_idx);
%求平面w^T x + b = 0的法向量w
alpha_SVs = model.sv_coef;%实际是a_i*y_i
w = sum(diag(alpha_SVs)*x_SVs)';%即西瓜书公式(6.9)
%求平面w^T x + b = 0的偏移项b
%由于是软件隔支持向量机,所以先找出正好在最大间隔边界上的支持向量
SVs_on = (abs(alpha_SVs)<1);%C=1 by parameter '-c 1'
y_SVs_on = y_SVs(SVs_on,:);
x_SVs_on = x_SVs(SVs_on,:);
%理论上可选取任意在最大间隔边界上的支持向量通过求解西瓜书式(6.17)获得b
b_temp = zeros(1,sum(SVs_on));%所有的b
for idx=1:sum(SVs_on)
b_temp(idx) = 1/y_SVs_on(idx)-x_SVs_on(idx,:)*w;
end
b = mean(b_temp);%更鲁棒的做法是使用所有支持向量求解的平均值
%将手动计算出的偏移项b与svmtrain给出的偏移项b对比
b_model = -model.rho;%model中的rho为-b
b-b_model
%将手动计算出的决策值与svmpredict输出的决策值对比
%决策值f(x)=w^T x + b
f_x = x * w + b;
sum(abs(f_x-dec_values))
??最后得到SVR求解的幅值相位,
总结
??针对传统算法分析谐波问题中存在的一些弊端,本文引入了基于统计学习理论的支持向量机学习算法。对支持向量机包含的各部分理论进行了详细而深入地分析和研究,在此基础上,归纳出了支持向量机在回归问题分析方面的具体步骤,为该算法在谐波分析中的应用奠定基础。最后,依据支持向量机相关理论,并结合可以增强算法抗噪声能力的损失函数,对引入的电力系统信号模型展开了深入的分析与研究,得出了支持向量机理论分析谐波问题的详细步骤。
源码:https://mianbaoduo.com/o/bread/mbd-YZuUmphp 参考文献 【1】基于支持向量机的谐波分析研究与实现_冯丽平 【2】https://blog.csdn.net/jbb0523/article/details/80918214
|