Robot_wet 2021-12-01 01:14 采纳率: 0%
浏览 22
已结题

matlab梯度下降及线搜索、K折交叉验证使目标函数最小化

img

function [y,noise] = Gnoisegen(x,snr)
% Gnoisegen函数是叠加高斯白噪声到语音信号x中
% [y,noise] = Gnoisegen(x,snr)
% x是语音信号,snr是设置的信噪比,单位为dB
% y是叠加高斯白噪声后的带噪语音,noise是被叠加的噪声
noise=randn(size(x));              % 用randn函数产生高斯白噪声
Nx=length(x);                      % 求出信号x长
signal_power = 1/Nx*sum(x.*x);     % 求出信号的平均能量
noise_power=1/Nx*sum(noise.*noise);% 求出噪声的能量
noise_variance = signal_power / ( 10^(snr/10) );    % 计算出噪声设定的方差值
noise=sqrt(noise_variance/noise_power)*noise;       % 按噪声的平均能量构成相应的白噪声
y=x+noise;                         % 构成带噪语音

function f=F(w,x, y,~,gama)
f=gama/2*norm(w)+norm(x*w-y);
% for i=1:(N-1)
%     y=y+(1-x(i))^2+100*(x(i+1)-x(i)^2)^2;

end

function g=G(w,x,y, N,gama)
g=zeros(N,1);
g(1)=gama*w(1)-x(1)*(x(1)*w(1)-y(1));
for i=2:N
    g(i)=gama*w(i)-x(i)*(x(i)*w(i)-y(i));
end
% g(1)=2*(x(1)-1)+400*(x(1)^3-x(2)*x(1));
% for i=2:(N-1)
%     g(i)=200*(x(i)-x(i-1)^2)+2*(x(i)-1)+400*(x(i)^3-x(i+1)*x(i));
% end
% g(N)=200*(x(N)-x(N-1)^2);
end

function y= Y(w,x,~)
%UNTITLED 此处显示有关此函数的摘要
%   此处显示详细说明
y=Gnoisegen(x*w,0.2);
% y=0;
% for i=1:m
%     y=y+Gnoisegen(x(i)*w(i),0.2);
% end
end


clc;
clear all;
n=100;
m=100;
gama=1; %待求
t=1;%待求
w_ture=randn(n,1);
%cosi=wgn(m);%cosi服从高斯分布,未实现
w_k=zeros(n,1);
a_0=0;
b_0=10;
k=0;
eps=0.1;
error=randn(n,1);
i=0;
DX=b_0-a_0;
x=randn(m,n);
while norm(error)>=eps
    k=k+1;
    fprintf('k=%d\n',k);
    y_k=Y(w_k,x,m);
    y_k_ture=Y(w_ture,x,m);
    objective_f=F(w_k,x,y_k,m,gama);
    f_diff=G(w_k,x,y_k,m,gama);
%     objective_f=gama/2*norm(w_k)+norm(x*w_k-y_k);
%     f_diff=gama*w_k+2*x*(x*w_k-y_k);
    data_w=-f_diff;
    %line search using golden-section
    while DX>0.05
        i=i+1;
        a=b_0-0.618*(b_0-a_0);
        b=a_0+0.618*(b_0-a_0);
        new_w_a=w_k+a*f_diff;
        new_w_b=w_k+b*f_diff;
        object_a=F(new_w_a,x,y_k,m,gama);
        object_b=F(new_w_b,x,y_k,m,gama);
%         objet_a=gama/2*norm(new_w_a)+norm(x*new_w_a-y_k);
%         objet_b=gama/2*norm(new_w_b)+norm(x*new_w_b-y_k);
        if object_a<=object_b
            a_0=a;
        elseif object_a>object_b
            b_0=b;
        end
        DX=abs(b_0-a_0);
        if DX<=0.05
            t=(a_0+b_0)/2;
            fprintf('optim_t=%.4f',t);
            fprintf('iter_times=%.1f',i);
            break;
        end
        
    end
    
    w_k_plus=w_k+t*data_w;
    error=norm(y_k_ture-y_k)/norm(y_k_ture);
    if error<eps
        fprintf('w_iter_times=%d',k);
%         fprintf('optim_w=%.3f',w_k)
         w_k
        break;
    else
        w_k=w_k_plus;
    end

    
end

1.请问X的生成和目标函数F的求取有没有问题?
2.请问如果我这样生成X是正确的,我该怎么去用k折交叉验证去求gama?
3.请问我的line search即线搜索是对的吗?我跑出的最优t似乎和b的设值大小有关
我做了大半天了,挺苦恼的,望解答,谢谢大家!

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 12月9日
    • 创建了问题 12月1日

    悬赏问题

    • ¥15 树莓派与pix飞控通信
    • ¥15 自动转发微信群信息到另外一个微信群
    • ¥15 outlook无法配置成功
    • ¥30 这是哪个作者做的宝宝起名网站
    • ¥60 版本过低apk如何修改可以兼容新的安卓系统
    • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
    • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
    • ¥50 有数据,怎么用matlab求全要素生产率
    • ¥15 TI的insta-spin例程
    • ¥15 完成下列问题完成下列问题