[笔记]机器学习--01线性回归

数据库:Iris 数据集;

属性:

  • 1. 花萼长度(Sepal Length)
  • 2. 花萼宽度(Sepal Width)
  • 3. 花瓣长度(Petal Length)
  • 4. 花瓣宽度(Petal Width)
  • 5. 种类:山鸢尾(Setosa),杂色鸢尾(Versicolour),维吉尼亚鸢尾(Virginica)

线性回归的目标是最小化成本函数:


  1. %% Initallization  
  2. clear all;  
  3. close all;  
  4. clc;  
  5.   
  6. %% ======================== Part 1: Plotting ===========================  
  7. fprintf('Plotting Data ...\n');  
  8. data = csvread('Iris.txt');  % 导入Iris 数据  
  9. x = data(:,1); y = data(:,3);  % 花萼长度&花瓣长度  
  10. m = length(y);  
  11.   
  12. % Plot Data  
  13. plotData(x,y);  
  14.   
  15. fprintf('Program paused. Press enter to continue. \n');  
  16. pause;  
  17.   
  18. %% ======================== Part 2: Gradient descent ===========================  
  19. fprintf('Running Gradient Descent ...\n');  
  20.   
  21. X = [ones(m, 1), data(:, 1)];  
  22. theta = zeros(21);  
  23.   
  24. % 参数设置  
  25. iterations = 1500;  
  26. alpha = 0.01;  
  27.   
  28. % 计算损失函数  
  29. %computeCost(X, y, theta);  
  30.   
  31. % 运行梯度下降  
  32. theta = gradientDescent(X, y, theta, alpha, iterations);  
  33.   
  34. fprintf('Theta found by gradient descent: ');  
  35. fprintf('%f %f \n', theta(1), theta(2));  
  36.   
  37. hold on;  
  38. plot(X(:,2), X*theta, 'r-');  
  39. legend('Training data''Linear regression')  
  40. hold off;  
  41.   
  42. predict1 = [18] * theta;  
  43. fprintf('对于花萼长度为8厘米, 花瓣长度预测为 %f cm\n', ...  
  44.     predict1);  
  45. predict2 = [15.5] * theta;  
  46. fprintf('对于花萼长度为5.5厘米, 花瓣长度预测为 %f cm\n', ...  
  47.     predict2);   
  48. fprintf('Program paused. Press enter to continue.\n');  
  49. pause;  
  50.   
  51. %% ======================== Part 3: Visualizing J (theta_0, theta_1, ) ===========================  
  52. fprintf('Visualizing J(theta_0, theta_1) ...\n')  
  53. % 数据可视化  
  54. theta0_vals = linspace(-1010100);  
  55. theta1_vals = linspace(-14100);  
  56.   
  57. J_vals = zeros(length(theta0_vals), length(theta1_vals));  
  58.   
  59. for i = 1:length(theta0_vals)  
  60.     for j = 1:length(theta1_vals)  
  61.         t = [theta0_vals(i); theta1_vals(j)];  
  62.         J_vals(i, j) = computeCost(X, y, t);  
  63.     end  
  64. end  
  65.   
  66. J_vals = J_vals';  
  67.   
  68. figure;  
  69. surf(theta0_vals, theta1_vals, J_vals)  
  70. xlabel('\theta_0'); ylabel('\theta_1');  
  71.   
  72. figure;  
  73.   
  74. contour(theta0_vals, theta1_vals, J_vals, logspace(-2320))  
  75. xlabel('\theta_0'); ylabel('\theta_1');  
  76. hold on;  
  77. plot(theta(1), theta(2), 'rx''MarkerSize'10'LineWidth'2); 

计算梯度下降:

  1. function [theta , J_history] = gradientDescent(X, y, theta, alpha, num_iters)  
  2.   
  3.     m = length(y);  
  4.     J_history = zeros(num_iters, 1);  
  5.   
  6.     for iter = 1:num_iters  
  7.         H = X * theta;  
  8.         T = [0 ; 0];  
  9.         for i = 1 : m  
  10.             T = T + (H(i) - y(i)) * X(i, :)';  
  11.         end  
  12.           
  13.         theta = theta - (alpha * T) / m;  
  14.           
  15.         J_history(iter) = computeCost(X, y, theta);  
  16.           
  17.     end  
  18.   
  19. end 

  1. function J = computeCost(X, y, theta)  
  2.   
  3.     m = length(y);  
  4.     J = 0;  
  5.   
  6.     J = sum((X*theta - y).^2) / (2.* m);  
  7.   
  8. end 

结果展示:



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值