KLMS 算法应用——非线性信道均衡

%LMS与KLMS应用于非线性信道均衡的学习曲线

clear all;
close all
clc

TD = 5;%时间嵌入长度
D = 2;%均衡滞后时间
h = 0.1;%高斯核参数

u = randn(1,2500)>0;
u = 2*u-1;% 生成二进制数据

z = u+0.5*[0,u(1:end-1)];% 非线性信道

ns = 0.4*randn(1,length(u));% 信道噪声

y = z - 0.9*z.^2 + ns;% 非线性信道输出

%数据大小
N_tr = 1000;%训练样本
N_te = 1000;%测试样本

%数据嵌入
X = zeros(TD,N_tr);
for k=1:N_tr
    X(:,k) = y(k:k+TD-1)';
end
% 测试数据
X_te = zeros(TD,N_te);
for k=1:N_te
    X_te(:,k) = y(k+N_tr:k+TD-1+N_tr)';
end

% 期望信号
T = zeros(N_tr,1);
for ii=1:N_tr
    T(ii) = u(D+ii);
end
% 测试信号
T_te = zeros(N_te,1);
for ii=1:N_te
    T_te(ii) = u(D+ii+N_tr);
end
%初始化
mse_te = zeros(1,N_tr);
mse_te_k = zeros(1,N_tr);
%=========Linear LMS===================
lr = 0.01;%步进参数
w1 = zeros(1,TD);
e_l = zeros(N_tr,1);
for n=1:N_tr
    y = w1*X(:,n);
    e_l(n) = T(n) - y;
    w1 = w1 + lr*e_l(n)*X(:,n)';
    %测试
    err = T_te'-(w1*X_te);
    mse_te(n) = mean(err.^2);
end
%=========Kernel LMS===================
lr_k = 0.2;
%初始化
e_k = zeros(N_tr,1);
y = zeros(N_tr,1);
y_te = zeros(N_te,1);

e_k(1) = T(1);
y(1) = 0;
mse_te_k(1) = mean(T_te.^2);

for n=2:N_tr
    %训练
    ii = 1:n-1;
    y(n) = lr_k*e_k(ii)'*(exp(-sum((X(:,n)*ones(1,n-1)-X(:,ii)).^2)*h))';
    
    e_k(n) = T(n) - y(n);
    
    %测试
    y_te = zeros(N_te,1);
    for jj = 1:N_te
        ii = 1:n;
        y_te(jj) = lr_k*e_k(ii)'*(exp(-sum((X_te(:,jj)*ones(1,n)-X(:,ii)).^2)*h))';
    end
    err = T_te - y_te;
    mse_te_k(n) = mean(err.^2);
end

figure
plot(mse_te,'b-','LineWidth',2)
hold on
plot(mse_te_k,'r--','LineWidth',2)
set(gca, 'FontSize', 14);
set(gca, 'FontName', 'Arial');

legend('LMS','KLMS')
xlabel('iteration')
ylabel('testing MSE')

结果如是:

性能比较:

%性能比较
clear all;
close all
clc

TD = 5;%时间嵌入长度
D = 2;%均衡滞后时间
h = 0.1;%高斯核参数

MC = 10;
err_l = zeros(MC,1);
err_k = zeros(MC,1);
err_rbf = zeros(MC,1);

np_v = [0.1, 0.4, 0.8];%标准差赋值

for kkk = 1:length(np_v)
    np = np_v(kkk);
    disp([num2str(MC), ' Monte Carlo simulations'])

    for mc=1:MC
        disp(mc)

        u = randn(1,6500)>0.5;
        u = 2*u-1;% 生成二进制数据
        
        z = u+0.5*[0,u(1:end-1)];% 非线性信道
      
        ns = np*randn(1,length(u));  % 信道噪声
        
        y = z - 0.9*z.^2 + ns;% 非线性信道输出

        %数据大小
        N_tr = 1000;
        N_te = 5000;

        %数据嵌入
        X = zeros(TD,N_tr);
        for k=1:N_tr
            X(:,k) = y(k:k+TD-1)';
        end
        % 测试数据
        X_te = zeros(TD,N_te);
        for k=1:N_te
            X_te(:,k) = y(k+N_tr:k+TD-1+N_tr)';
        end

        % 期望信号
        T = zeros(N_tr,1);
        for ii=1:N_tr
            T(ii) = u(D+ii);
        end

        T_te = zeros(N_te,1);
        for ii=1:N_te
            T_te(ii) = u(D+ii+N_tr);
        end
        %=========Linear LMS===================
        lr = 0.005;%步进参数
        w1 = zeros(1,TD);
        e_l = zeros(N_tr,1);
        b_l = 0;
        for n=1:N_tr
            y = w1*X(:,n) + b_l;
            e_l(n) = T(n) - y;
            w1 = w1 + lr*e_l(n)*X(:,n)';
            b_l = b_l + lr*e_l(n);
        end
        %测试
        uhat = 2*(w1*X_te + b_l>0)-1;
        err_l(mc) = length(find(T_te'-uhat))/N_te;
       
        %=========Kernel LMS===================
        lr_k = 0.1;%步进参数
        %初始化
        e_k = zeros(N_tr,1);
        b_k = 0;
        y = zeros(N_tr,1);

        e_k(1) = T(1);
        y(1) = 0;
    
        for n=2:N_tr
            %训练
            ii = 1:n-1;
            y(n) = lr_k*e_k(ii)'*(exp(-sum((X(:,n)*ones(1,n-1)-X(:,ii)).^2)*h))'+b_k;
            e_k(n) = T(n) - y(n);
            b_k = b_k + lr_k*e_k(n);
        end
        %测试
        y_te = zeros(N_te,1);
        for jj = 1:N_te
            ii = 1:n;
            y_te(jj) = lr_k*e_k(ii)'*(exp(-sum((X_te(:,jj)*ones(1,n)-X(:,ii)).^2)*h))'+b_k;
        end
        uhat = 2*(y_te>0)-1;
        err_k(mc) = length(find(T_te - uhat))/N_te;
        %========RN===================
        lam = 1;
        G = zeros(N_tr,N_tr);
        for i=1:N_tr-1
            j=i+1:N_tr;
            G(i,j)=exp(-sum((X(:,i)*ones(1,N_tr-i)-X(:,j)).^2)*h);
            G(j,i)=G(i,j)';
        end
        G = G + eye(N_tr);
        G_lam =G + lam*eye(N_tr);
        a = inv(G_lam)*T;

        %testing
        for jj = 1:N_te
            y_te(jj) = a'*(exp(-sum((X_te(:,jj)*ones(1,N_tr)-X).^2)*h))';
        end
        uhat = 2*(y_te>0)-1;
        err_rbf(mc) = length(find(T_te - uhat))/N_te;
    end

    disp('========================================')
    disp(['noise deviation = ',num2str(np)])
    disp('<<LMS')
    disp([num2str(mean(err_l)),'+/-',num2str(std(err_l))])
    disp('<<KLMS')
    disp([num2str(mean(err_k)),'+/-',num2str(std(err_k))])
    disp('<<RN')
    disp([num2str(mean(err_rbf)),'+/-',num2str(std(err_rbf))])

end

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Python KLMS是一种机器学习算法,全称为Kernel Least Mean Square,是基于核函数的最小平方算法。它是一种在线学习算法,即它能够根据新数据动态地调整模型,因此适用于大数据环境下的应用。 Python KLMS通过引入核函数将欧几里得距离转化为高维特征空间中的内积,从而将非线性问题转变为线性问题。这种特征转换不需要显式地计算高维空间中的内积,而是直接使用核函数的属性进行计算,因此大大降低了计算复杂度。 Python KLMS具有许多优点。首先,它是一种高效的算法,可以处理大规模数据集,并且具有良好的适应性和鲁棒性。其次,Python KLMS具有较低的复杂度,并且能够不断地更新学习模型,以适应新数据的输入。此外,Python KLMS还可以适用于许多实际问题,例如图像分类、语音识别、信号处理等,因此受到了广泛的关注和应用。 尽管Python KLMS具有很多优点,但是也存在一些缺点。例如,它可能对于高维数据不够有效,因为在高维空间中,核函数的计算会变得非常昂贵。此外,由于核函数的选择问题,Python KLMS对于新问题的适应性可能会受到限制。 总之,Python KLMS是一种有前途的机器学习算法,因为它具有高效性、灵活性和鲁棒性等优点,能够适用于多种实际问题。随着研究的深入,Python KLMS将不断完善和发展,成为机器学习领域的重要组成部分。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值