線性迴歸是迴歸模型中最簡單的一種。
最近在做一個預測指數的項目,整理輸入數據之後,用線性迴歸模型試了一下,總體上效果一般般。
一、 迴歸模型
輸入:
其中N爲特徵的維數。
每一維特徵對應一個basis function,記爲
權值:
假設預測目標是輸入特徵向量的基函數的線性組合,則
假設預測值y與實際值h之間的噪聲 服從高斯分佈:
此時,maximum likelihood等價於least square error,
誤差平方和爲:
爲了防止出現過擬合,加上正則項:
目標函數:
{E}
解得,
二、 算法實現
以下是用matlab實現的線性迴歸模型代碼:
%load data
input = load('xxxx');
[len dim] = size(input);
%取一部分做爲訓練集
s1 = floor(len*0.8);
input1 = input(1:s1, :);
input2 = input(s1+1:len, :);
%計算健康指數
k = 0.2;
H = zeros(len, 1);
H(:, 1) = (1 - k) * (1 - data(:, 3)) + k * data(:, bbb+1);
H1 = H(1:s1, :);
H2 = H(s1+1:len, :);
%計算每個特徵的均值和方差
args = zeros(dim, 2);
for i = 1 : dim
factor = input1(:, i);
args(i, 1) = mean(factor);
args(i, 2) = var(factor);
end
%得到PHI矩陣
PHI = zeros(s1, dim);
for i = 1:s1
for j = 1:dim
PHI(i, j) = Phi(input1(i, j), args(j, 1), args(j, 2));
end
end
%計算最後的權值
lamda = 15;
I = eye(dim);
W = (inv(lamda .* I + PHI' * PHI)) * PHI' * H1;
PDICT = zeros(len-s1, 2);
PDICT(:, 1) = H2(:, 1);
for i = 1:len-s1
PDICT(i, 2) = Predict(input2(i, :), W, args);
end
E = zeros(len-s1, 1);
E(:, 1) = (PDICT(:, 1) - PDICT(:, 2));
E(:, 1) = E(:, 1) .* E(:, 1);
Erms = sqrt(sum(E)/(len-s1));