一.多變量線性回歸問題(linear regression with multiple variables)
- 搭建環境Octave
Windows的安裝包可由此鏈接獲取:https://ftp.gnu.org/gnu/octave/windows/,可以選擇一個比較新的版本進行安裝,本人win10操作系統,安裝版本4.2.1,沒有任何問題。注意不要安裝4.0.0這個版本。當然安裝MATLAB也是可以的,我兩個軟件都安裝了,在本課程中只使用Octave就已經足夠用了! - 符號標記:n(樣本的特征數/屬性數目),
表示第i個訓練樣本的第j個特征。樣本可能有多個屬性值,在房價預測案例中,可能有多種因素如房屋大小、樓層、裝修程度等共同決定最終房價。
-
預測函數(Hypothesis):hθ(x)=θ0+θ1x1+θ2x2+……+θnxn,記x0=1(
)
所以預測函數使用矩陣相乘的形式可寫為:hθ(x)=ΘTX. -
代價函數(Cost Function)形式:其中參數θn的數目和特征數n相同。
- 梯度下降算法:(注意同時更新所有θ值)
- Feature Scaling(特征縮放):確保各個特征的取值近似,否則收斂速度會很慢。建議:將所有特征取值近似縮放到[-1,1]之間,當然也不必特別精准,只是為了梯度下降運算速度更快。
方法(Mean Normalization):xi=(xi-μi)/si,μi是xi的平均值,si是xi的標准差或者是xi的范圍(xmax-xmin)。x0不需要進行特征縮放,因為我們在前面將x0記為1。 - 學習速率α:α過大,梯度下降難以收斂,代價函數J(θ)甚至會變大。α過小,梯度下降收斂速度慢。如何判斷已經收斂:兩次迭代代價函數J(θ)差值是否小於某一個閾值(不好找)。
- 正規方程(Normal Equation):求解θ的解析方法,該方法不需要做特征縮放。
公式如下:θ=(XTX)-1XTY Octave代碼:pinv(X`*X)*X`*Y,或者使用inv函數
正規方程和梯度下降方法求解θ特點:不需要選擇學習速率α,不需要進行迭代求解。當特征數目n>106很大時,梯度下降可以很好的求解,但是正規方程的求解速度將會很慢。
當存在冗余的特征,十分的接近的特征或者特征過多(n>m)時,XTX會不可逆,這時使用Octave的pinv函數依舊可以求出結果。
二.Octave的簡單使用
-
變量的賦值
%后內容表示注釋 ~=為不等號 &&邏輯與 ||邏輯或 xor( , )邏輯異或 format long/short控制輸出格式
PSI('>>'); %簡化命令行顯示
a=3 %變量賦值
a=3; %末尾;可以抑制打印輸出
disp(a); %打印變量值,或者直接輸出字母a
disp(sprintf('2 decimals: %0.2f',a)) %類似C語言的形式輸出兩位小數
A=[1 2;3 4;5 6] %定義一個矩陣
V=1:0.1:2 %定義一個1行11列矩陣
C=2*ones(2,3) %定義一個2行3列的矩陣,所有元素都是2
W=zeros(1,3) %定義一個1行3列的矩陣,所有元素都是0
rand(3,3) %隨機賦值3*3矩陣
randn(3,3) %隨機賦值3*3矩陣,符合高斯分布,平均值為0,方差為1
w=-6+sqrt(9)*(randn(1,1000)); 變量w賦值,w是一個均值為-6,方差為3的矩陣
hist(w) %畫直方圖,hist為統計函數,默認統計10個區間中,出現w的個數,縱軸值為個數
eye(4)%設置4階單位矩陣
- 數據的處理
pwd命令顯示當前路徑 cd命令轉換路徑 ls命令顯示文件列表 who命令顯示工作空間中的變量 whos命令顯示變量的詳細信息
clear features X刪除變量X 導入數據命令load featuresX.dat或load('featuresX.dat') clear命令清空工作空間中所有變量
size(A) %求矩陣的維數,返回的值也是一個矩陣,也可用於求向量的維數
length(v) %求向量的維數,一般不用於矩陣
v=priceY(1:10) %將priceY中前10個數據存入v中
save hello.mat v; %將v的數據存入硬盤中,.mat格式文件按照二進制形式存取,占用空間小
save hello.txt v -ascii %將v中的數據按照字符形式進行存儲
A(3,2) %矩陣A3行2列的元素值
A(2,:) %矩陣A2行上所有元素的值
A([1 3],:) %矩陣A中1,3行所有元素的值
A(:,2)=[10;11;12] %對矩陣A第二列所有元素重新賦值
A=[A,[1;2;3]] %矩陣A新增一列
A(:) %將矩陣A中元素按列拼接,輸出一個向量
C=[A B] %將矩陣A,B左右拼接
C=[A;B] %將矩陣A,B上下拼接
A.*B %矩陣A,B同階,對應元素相乘
A.^2 %矩陣A中元素做平方
1./A %矩陣A中元素取到數
log(v) %求自然對數,e為底 exp(v) %求指數 abs(v) %求絕對值 A`為A的轉置 pinv(A)為A的逆
val=max(a) %返回向量中的最大值
[val ind]=max(a) %返回向量中的最大值和最大值的索引
a<3 %該操作對向量中的元素逐個進行比較 find(a<3) %顯示滿足條件的下標
A=magic(3)%生成一個3*3維的magic matrix,每行每列值的和相等
[r,c]=find(A>7) %返回滿足條件的行列向量索引
sum(a) %將向量所有元素值相加 prod(a) %求向量所有元素值的乘積 floor(a) %將所有元素指向下取整 ceil(a) %將所有元素值向上取整
max(A,[],1) %求每列最大值 max(A,[],2) %求每行最大值 max(max(A)) %求矩陣A中的最大值,也可寫為max(A(:))
sum(A,1) %求矩陣A每列的和 sum(A,2) %求矩陣A每行的和
sum(sum(A.*eye(9))) %計算對角線值的和 sum(sum(A.*flipud(eye(9)))) %計算反向對角線的和
-
繪制數據
- 語句和函數
v=zeros(10,1) for i=1:10, %for語句 v(i)=2^i; end;
i=1;
while i<=5, %while語句
v(i)=100;
i=i+1;
end;
i=1;
while true, %break語句
v(i)=999;
i=i+1;
if i==6,
break;
end;
end;
v(1)=2;
if v(1)==1, %if-elseif-if語句
disp('the value is one');
elseif v(1)==2,
disp('the value is two');
else
disp('the value is not one or two')
end;
- 函數:創建文件,以函數名來命名,以.m后綴結尾。
- 創建Octave搜索路徑:% Octave search path (advanced/optimal)
addpath('c:\Users\ang\Desktop')
函數文件在該路徑下,自動檢索。 - Octave語法中函數可以返回多個值。
- 向量化:建議計算時進行向量計算,不使用循環。