mixexp_graddesc.m

来自「用matlab实现贝叶斯网络的学习、推理。」· M 代码 · 共 52 行

M
52
字号
%%%%%%%%%%function [theta, eta] = mixture_of_experts(q, data, num_iter, theta, eta)% MIXTURE_OF_EXPERTS Fit a piecewise linear regression model using stochastic gradient descent.% [theta, eta] = mixture_of_experts(q, data, num_iter)%% Inputs:% q = number of pieces (experts)% data(l,:) = input example l % % Outputs:% theta(i,:) = regression vector for expert i% eta(i,:) = softmax (gating) params for expert i[num_cases dim] = size(data);data = [ones(num_cases,1) data]; % prepend with offsetmu = 0.5; % step sizesigma = 1; % variance of noiseif nargin < 4  theta = 0.1*rand(q, dim);  eta = 0.1*rand(q, dim);endfor t=1:num_iter  for iter=1:num_cases    x = data(iter, 1:dim);    ystar = data(iter, dim+1); % target    % yhat(i) = E[y | Q=i, x] = prediction of i'th expert    yhat = theta * x';     % gate_prior(i,:) = Pr(Q=i | x)    gate_prior = exp(eta * x');    gate_prior = gate_prior / sum(gate_prior);    % lik(i) = Pr(y | Q=i, x)    lik = (1/(sqrt(2*pi)*sigma)) * exp(-(0.5/sigma^2) * ((ystar - yhat) .* (ystar - yhat)));    % gate_posterior(i,:) = Pr(Q=i | x, y)    gate_posterior = gate_prior .* lik;    gate_posterior = gate_posterior / sum(gate_posterior);    % Update    eta = eta + mu*(gate_posterior - gate_prior)*x;    theta = theta + mu*(gate_posterior .* (ystar - yhat))*x;  end  if mod(t,100)==0    fprintf(1, 'iter %d\n', t);  endendfprintf(1, '\n');

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?