matlab實現線性迴歸成績預測
阿新 • • 發佈:2018-10-31
目的
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上去。