機器學(xué)習(xí) 1 - Linear regression with multiple variables

簡述

最近在coursera上看Stanford的經(jīng)典機器學(xué)習(xí)課程,總體上感覺跟國內(nèi)某大學(xué)的研究生課程內(nèi)容其實差不多墙贱。先從經(jīng)典的線性回歸模型開始寫起吧叙淌。本文的模型實例來自于課程練習(xí)——根據(jù)房屋大小和房屋數(shù)量的統(tǒng)計數(shù)據(jù)來預(yù)估某房產(chǎn)的售價底挫,多元線性回歸的數(shù)據(jù)集在ex1data2文件中可以找到寿烟,一元數(shù)據(jù)集在ex1data1中。

PS:由于一元線性回歸也屬于一種特殊的多元線性回歸走搁,我決定偷懶直接上多元線性回歸独柑。

算法過程

主要包括幾個方面:

  • 數(shù)據(jù)清理(本例中主要是feature normalize)
  • 算法
  • gradient descent(梯度下降)
  • normal equation(正規(guī)方程)

數(shù)據(jù)清理

主要是讓數(shù)據(jù)集處于一種“密集穩(wěn)定”的狀態(tài),否則不經(jīng)過整理的數(shù)據(jù)集會讓你在選擇學(xué)習(xí)率的時候異常尷尬私植。(我親自試過忌栅,你也可以試試不清理數(shù)據(jù)直接用梯度下降,看看會發(fā)生什么)不整理數(shù)據(jù)曲稼,有時候你可能會只能選用非常小的學(xué)習(xí)率狂秘,才能保證梯度下降的時候不會“跑飛”。(迭代到不收斂)然而這個學(xué)習(xí)率可能會非常的小躯肌,導(dǎo)致你在訓(xùn)練的時候者春,可能要迭代幾千萬次才能訓(xùn)練一點點,甚至根本無法訓(xùn)練清女。

一般來說钱烟,我們選擇將數(shù)據(jù)“正態(tài)化”.根據(jù)統(tǒng)計學(xué)基礎(chǔ)知識,算出均值和標(biāo)準(zhǔn)差嫡丙,使得數(shù)據(jù)呈標(biāo)準(zhǔn)正態(tài)分布即可拴袭。在matlab中,均值函數(shù)為mean(),標(biāo)準(zhǔn)差函數(shù)為std()曙博。

梯度下降

想要使用一個線性方程來擬合數(shù)據(jù)集拥刻,當(dāng)數(shù)據(jù)集是N元的時候,則需要選擇N個變量來與這些未知數(shù)組成線性方程父泳,這N個變量記作theta般哼。在迭代的首次吴汪,當(dāng)然可以隨意選擇一組未知數(shù)開始。
接下來蒸眠,就是選擇一個代價函數(shù)cost()漾橙,注意此函數(shù)的自變量當(dāng)然是N個theta,使得代價函數(shù)最欣憧ā(與實際情況擬合的最好)霜运。一般來說,我們選擇最小二乘法來判斷代價的大小蒋腮。

接下來淘捡,為了判斷N元函數(shù)cost()的最小值點,就是一個求導(dǎo)的過程了池摧。這里要插一句題外話焦除,線性回歸代價函數(shù)的最小值就是極小值,因此不存在迭代到某個極小值之后卡死在某點而不能繼續(xù)尋找最小值的情況险绘,具體的可以自己證明踢京。

梯度下降算法采用了梯度的概念誉碴,在某點沿著梯度的方向移動一小段距離宦棺,然后重復(fù)迭代這個過程,直到完成收斂黔帕。

正規(guī)方程

正規(guī)方程前面與梯度下降一樣代咸,只不過最小二乘擬合的答案直接通過數(shù)學(xué)方法由線性代數(shù)方程解出來。優(yōu)點是:不需要迭代成黄,不需要清理數(shù)據(jù)(因為不需要調(diào)整學(xué)習(xí)率呐芥,所以自然不需要整理數(shù)據(jù)呀),程序?qū)懫饋矸浅:唵畏芩辍H秉c是:當(dāng)參數(shù)過多的時候思瘟,逆矩陣運算量太大;當(dāng)參數(shù)存在線性關(guān)系的時候闻伶,逆矩陣當(dāng)然是不存在的~這個時候你沒法求逆矩陣了(當(dāng)然可以用偽逆矩陣來求滨攻,但是不推薦)。不過就我個人經(jīng)驗而言蓝翰,一般來說參數(shù)不太可能會出現(xiàn)線性相關(guān)的情況光绕。如果出現(xiàn)了,可能會存在意義有重復(fù)參數(shù)畜份,這個時候就要清理一下數(shù)據(jù)集诞帐,把不必要的參數(shù)項給去掉,就不會求解的時候出現(xiàn)矩陣不可逆的尷尬情況了爆雹。

程序

程序使用matlab寫的停蕉,coursera是可以提交答案的~具體的提交方法可以參考pdf說明愕鼓。

多元線性回歸的主函數(shù):


%% Initialization

%% ================ Part 1: Feature Normalization ================

%% Clear and Close Figures
clear ; close all; clc

fprintf('Loading data ...\n');

%% Load Data
data = load('ex1data2.txt');
X = data(:, 1:2);
y = data(:, 3);
m = length(y);

% Print out some data points
fprintf('First 10 examples from the dataset: \n');
fprintf(' x = [%.0f %.0f], y = %.0f \n', [X(1:10,:) y(1:10,:)]');

fprintf('Program paused. Press enter to continue.\n');
pause;

% Scale features and set them to zero mean
fprintf('Normalizing Features ...\n');

[X, mu, sigma] = featureNormalize(X);
% Add intercept term to X
X = [ones(m, 1) X];
std(X(:,2))
std(X(:,2))
X(:,2)

%% ================ Part 2: Gradient Descent ================

fprintf('Running gradient descent ...\n');

% Choose some alpha value
alpha = 0.01;
num_iters = 400;

% Init Theta and Run Gradient Descent 
theta = zeros(3, 1);
computeCostMulti(X,y,theta)
[theta, J_history] = gradientDescentMulti(X, y, theta, alpha, num_iters);

% Plot the convergence graph
figure;
plot(1:numel(J_history), J_history, '-b', 'LineWidth', 2);
xlabel('Number of iterations');
ylabel('Cost J');

% Display gradient descent's result
fprintf('Theta computed from gradient descent: \n');
fprintf(' %f \n', theta);
fprintf('\n');

% Estimate the price of a 1650 sq-ft, 3 br house
% Recall that the first column of X is all-ones. Thus, it does
% not need to be normalized.
price = 0; % You should change this
parameter = [1650,3];
parameter = (parameter-mu)./sigma;
parameter = [1,parameter];
price = theta'*parameter';

fprintf(['Predicted price of a 1650 sq-ft, 3 br house ' ...
         '(using gradient descent):\n $%f\n'], price);

fprintf('Program paused. Press enter to continue.\n');
pause;

%% ================ Part 3: Normal Equations ================

fprintf('Solving with normal equations...\n');

%% Load Data
data = csvread('ex1data2.txt');
X = data(:, 1:2);
y = data(:, 3);
m = length(y);

% Add intercept term to X
X = [ones(m, 1) X];

% Calculate the parameters from the normal equation
theta = normalEqn(X, y);

% Display normal equation's result
fprintf('Theta computed from the normal equations: \n');
fprintf(' %f \n', theta);
fprintf('\n');


% Estimate the price of a 1650 sq-ft, 3 br house

price = 0; % You should change this
parameter = [1,1650,3];
price = theta'*parameter';


fprintf(['Predicted price of a 1650 sq-ft, 3 br house ' ...
         '(using normal equations):\n $%f\n'], price);


多元線性回歸的梯度下降函數(shù):

function [theta, J_history] = gradientDescentMulti(X, y, theta, alpha, num_iters)

% Initialize some useful values
m = length(y); % number of training examples
J_history = zeros(num_iters, 1);

for iter = 1:num_iters
    delta = zeros(size(X,2),1);
    for i=1:size(X,2)
        delta(i,1)=sum((theta'*X'-y').*(X(:,i))')*alpha/m;
    end
    theta = theta - delta;

    % Save the cost J in every iteration    
    J_history(iter) = computeCostMulti(X, y, theta);

end

end

數(shù)據(jù)正態(tài)化整理:

function [X_norm, mu, sigma] = featureNormalize(X)
X_norm = X;
mu = zeros(1, size(X, 2));
sigma = zeros(1, size(X, 2));
for i=1:size(X,2)
    mu(1,i)=mean(X(:,i));
    sigma(1,i)=std(X(:,i));
end

for i=1:size(X,2)
    X_norm(:,i)= (X_norm(:,i)-mu(1,i))/sigma(1,i);
end    

end

正規(guī)方程函數(shù):

function [theta] = normalEqn(X, y)
theta = zeros(size(X, 2), 1);

theta = (X'*X)^(-1)*X'*y;

end

總結(jié)

總體來說,是一個比較簡單的算法谷徙,高等數(shù)學(xué)和線性代數(shù)基礎(chǔ)扎實的同學(xué)理解起來應(yīng)該非常容易拒啰。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市完慧,隨后出現(xiàn)的幾起案子谋旦,更是在濱河造成了極大的恐慌,老刑警劉巖屈尼,帶你破解...
    沈念sama閱讀 223,002評論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件册着,死亡現(xiàn)場離奇詭異,居然都是意外死亡脾歧,警方通過查閱死者的電腦和手機甲捏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評論 3 400
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鞭执,“玉大人司顿,你說我怎么就攤上這事⌒址模” “怎么了大溜?”我有些...
    開封第一講書人閱讀 169,787評論 0 365
  • 文/不壞的土叔 我叫張陵,是天一觀的道長估脆。 經(jīng)常有香客問我钦奋,道長,這世上最難降的妖魔是什么疙赠? 我笑而不...
    開封第一講書人閱讀 60,237評論 1 300
  • 正文 為了忘掉前任付材,我火速辦了婚禮,結(jié)果婚禮上圃阳,老公的妹妹穿的比我還像新娘厌衔。我一直安慰自己,他們只是感情好捍岳,可當(dāng)我...
    茶點故事閱讀 69,237評論 6 398
  • 文/花漫 我一把揭開白布富寿。 她就那樣靜靜地躺著,像睡著了一般祟同。 火紅的嫁衣襯著肌膚如雪作喘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,821評論 1 314
  • 那天晕城,我揣著相機與錄音泞坦,去河邊找鬼。 笑死砖顷,一個胖子當(dāng)著我的面吹牛贰锁,可吹牛的內(nèi)容都是我干的赃梧。 我是一名探鬼主播,決...
    沈念sama閱讀 41,236評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼豌熄,長吁一口氣:“原來是場噩夢啊……” “哼授嘀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起锣险,我...
    開封第一講書人閱讀 40,196評論 0 277
  • 序言:老撾萬榮一對情侶失蹤蹄皱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后芯肤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體巷折,經(jīng)...
    沈念sama閱讀 46,716評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,794評論 3 343
  • 正文 我和宋清朗相戀三年崖咨,在試婚紗的時候發(fā)現(xiàn)自己被綠了锻拘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,928評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡击蹲,死狀恐怖署拟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情歌豺,我是刑警寧澤推穷,帶...
    沈念sama閱讀 36,583評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站世曾,受9級特大地震影響缨恒,放射性物質(zhì)發(fā)生泄漏谴咸。R本人自食惡果不足惜轮听,卻給世界環(huán)境...
    茶點故事閱讀 42,264評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望岭佳。 院中可真熱鬧血巍,春花似錦、人聲如沸珊随。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽塌鸯。三九已至童芹,卻和暖如春岳颇,著一層夾襖步出監(jiān)牢的瞬間蹋肮,已是汗流浹背粮彤。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評論 1 274
  • 我被黑心中介騙來泰國打工蜜唾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留仅醇,地道東北人艺晴。 一個月前我還...
    沈念sama閱讀 49,378評論 3 379
  • 正文 我出身青樓昼钻,卻偏偏與公主長得像掸屡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子然评,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,937評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 機器學(xué)習(xí)是做NLP和計算機視覺這類應(yīng)用算法的基礎(chǔ)仅财,雖然現(xiàn)在深度學(xué)習(xí)模型大行其道,但是懂一些傳統(tǒng)算法的原理和它們之間...
    在河之簡閱讀 20,516評論 4 65
  • AI人工智能時代碗淌,機器學(xué)習(xí)盏求,深度學(xué)習(xí)作為其核心,本文主要介紹機器學(xué)習(xí)的基礎(chǔ)算法亿眠,以詳細線介紹 線性回歸算法 及其 ...
    erixhao閱讀 13,892評論 0 36
  • 101.深度學(xué)習(xí)(CNN RNN Attention)解決大規(guī)模文本分類問題风喇。 用深度學(xué)習(xí)(CNN RNN Att...
    大黃大黃大黃閱讀 13,832評論 2 42
  • 不知為什么魂莫,姥姥懂接生,會刮砭爹耗,能治傷耙考。她那雙手呀,在我眼里不是聚寶盆潭兽,就是萬花筒倦始。 我從小體弱多病,喝藥比吃飯都...
    荊芥草閱讀 661評論 1 11
  • 就讓我這樣放縱下去吧山卦,我已經(jīng)不再有任何的想念了……我知道了自己的選擇自己承受鞋邑,我還是不怪任何人,只怪自己命賤账蓉,命里...
    被遺忘的嫁紗閱讀 227評論 0 0