1. 程式人生 > >matlab實現線性迴歸成績預測

matlab實現線性迴歸成績預測

目的

1. 熟悉matlab基本語法。

2. 使用matlab進行繪圖。

3. 複習線性迴歸於梯度下降。

資料集

與之前的文章,樸素貝葉斯實現成績等級分類相同,也是某市一模考試成績(只保留了語文英語數學和總分)

假設函式

等號的左側代表預測的成績,左側(θ0,θ1,θ2,θ3)代表引數,考慮到成績的實際情況,可以將θ0定義為0,因此要求的引數列表為(θ1,θ2,θ3)。x1,x2,x3分別代表語文成績,英語成績和數學成績。

損失函式

使用梯度下降演算法進行迭代

matlab程式碼

gradient_descent.m

[num,grades_matrix,row] = xlsread('d:/mlGrades/1.xls',1,'A2:D4000');
grades_matrix = str2double(grades_matrix);
parameters = [0,0,0];
step = 0.0000003;
points = [];
for i = 1:1500
    grades_total = grades_matrix(i,:);
    chinese = grades_total(1);
    english = grades_total(2);
    math = grades_total(3);
    total = grades_total(4);
    grades = [chinese english math];
    parameters = parameters - step*(parameters*grades'-total).*grades;
    total_predict = parameters*grades';
    points(end+1)=total - total_predict;
end
plot(points)

這裡面的程式碼簡單解釋一下,xlsread的返回有三個值,num代表excel檔案中的數字矩陣,grades_matrix代表excel中的文字矩陣,row代表當前行。

這裡面出現的問題是無論我怎麼設定,xlsread這個函式都會把表中的數字識別為字串,因此需要str2double把字串矩陣轉化為向量矩陣。

在matlab中,*代表矩陣正常的相乘,.*代表矩陣元素與元素直接相乘,grades'代表grades矩陣的轉置。

plot函式用於繪圖。

結果

可以看到經過大約五百次左右的迭代後,實際值與預測值的差值在0左右波動,達到了最終的目的。

結論

最後得到的三個引數的值分別為1.5460(語文),1.5583(英語),1.8500(數學)。

這說明了什麼呢?對於理科生來說,數學當然是最最最最重要的啦٩(๑>◡<๑)۶ 

程式碼和資料集稍後整理髮布到github上去。