首页 > 代码库 > Linear regression with multiple variables(多特征的线型回归)算法实例_梯度下降解法(Gradient DesentMulti)以及正规方程解法(Normal Equation)

Linear regression with multiple variables(多特征的线型回归)算法实例_梯度下降解法(Gradient DesentMulti)以及正规方程解法(Normal Equation)

 

%第一列为 size of House(feet^2),第二列为 number of bedroom,第三列为 price of House
1
2104,3,399900 2 1600,3,329900 3 2400,3,369000 4 1416,2,232000 5 3000,4,539900 6 1985,4,299900 7 1534,3,314900 8 1427,3,198999 9 1380,3,21200010 1494,3,24250011 1940,4,23999912 2000,3,34700013 1890,3,32999914 4478,5,69990015 1268,3,25990016 2300,4,44990017 1320,2,29990018 1236,3,19990019 2609,4,49999820 3031,4,59900021 1767,3,25290022 1888,2,25500023 1604,3,24290024 1962,4,25990025 3890,3,57390026 1100,3,24990027 1458,3,46450028 2526,3,46900029 2200,3,47500030 2637,3,29990031 1839,2,34990032 1000,1,16990033 2040,4,31490034 3137,3,57990035 1811,4,28590036 1437,3,24990037 1239,3,22990038 2132,4,34500039 4215,4,54900040 2162,4,28700041 1664,2,36850042 2238,3,32990043 2567,4,31400044 1200,3,29900045 852,2,17990046 1852,4,29990047 1203,3,239500
 1 %  Exercise 1: Linear regression with multiple variables 2  3 %% Initialization 4  5 %% ================ Part 1: Feature Normalization ================ 6  7 %% Clear and Close Figures 8 clear ; close all; clc 9 10 fprintf(Loading data ...\n);11 12 %% Load Data13 data = http://www.mamicode.com/load(ex1data2.txt);14 X = data(:, 1:2);15 y = data(:, 3);16 m = length(y);17 18 % Print out some data points19 fprintf(First 10 examples from the dataset: \n);20 fprintf( x = [%.0f %.0f], y = %.0f \n, [X(1:10,:) y(1:10,:)]);21 22 fprintf(Program paused. Press enter to continue.\n);23 pause;24 25 % Scale features and set them to zero mean26 fprintf(Normalizing Features ...\n);27 28 [X, mu, sigma] = featureNormalize(X);

 1 %featureNormalize(X)函数实现 2 function [X_norm, mu, sigma] = featureNormalize(X) 3 X_norm = X;                      % X是需要正规化的矩阵 4 mu = zeros(1, size(X, 2));       % 生成 1x3 的全0矩阵 5 sigma = zeros(1, size(X, 2));    % 同上 6  7 % Instructions: First, for each feature dimension, compute the mean 8 %               of the feature and subtract it from the dataset, 9 %               storing the mean value in mu. Next, compute the 10 %               standard deviation of each feature and divide11 %               each feature by its standard deviation, storing12 %               the standard deviation in sigma. 13 %14 %               Note that X is a matrix where each column is a 15 %               feature and each row is an example. You need 16 %               to perform the normalization separately for 17 %               each feature. 18 %19 % Hint: You might find the mean and std functions useful.20 21 % std,均方差,std(X,0,1)求列向量方差,std(X,0,2)求行向量方差。22 23 mu = mean(X, 1);                 %求每列的均值--即一种特征的所有样本的均值24 sigma = std(X);                  %默认同std(X,0,1)求列向量方差25 %fprintf(Debug....\n); disp(sigma);  26 i = 1;27 len = size(X,2);                 %行数28 while i <= len,29     %对每列的所有行上的样本进行normalization(归一化):(每列的所有行-该列均值)/(该列的标准差)30     X_norm(:,i) = (X(:,i) - mu(1,i)) / (sigma(1,i));31     i = i + 1;32 end

 

 1 % Add intercept term to X  2 X = [ones(m, 1) X];         3  4  5 %% ================ Part 2: Gradient Descent ================ 6  7 % ====================== YOUR CODE HERE ====================== 8 % Instructions: We have provided you with the following starter 9 %               code that runs gradient descent with a particular10 %               learning rate (alpha). 11 %12 %               Your task is to first make sure that your functions - 13 %               computeCost and gradientDescent already work with 14 %               this starter code and support multiple variables.15 %16 %               After that, try running gradient descent with 17 %               different values of alpha and see which one gives18 %               you the best result.19 %20 %               Finally, you should complete the code at the end21 %               to predict the price of a 1650 sq-ft, 3 br house.22 %23 % Hint: By using the hold on command, you can plot multiple24 %       graphs on the same figure.25 %26 % Hint: At prediction, make sure you do the same feature normalization.27 %28 29 fprintf(Running gradient descent ...\n);30 31 % Choose some alpha value32 alpha = 0.03;                         % learning rate - 可尝试0.01,0.03,0.1,0.3...33 num_iters = 400;                      % 迭代次数34 35 % Init Theta and Run Gradient Descent 36 theta = zeros(3, 1);                  % 3x1的全零矩阵37 [theta, J_history] = gradientDescentMulti(X, y, theta, alpha, num_iters);
% gradientDescentMulti()函数实现
1
function [theta, J_history] = gradientDescentMulti(X, y, theta, alpha, num_iters) 2 3 % theta = GRADIENTDESCENTMULTI(x, y, theta, alpha, num_iters) updates theta by 4 % taking num_iters gradient steps with learning rate alpha 5 6 % Initialize some useful values 7 m = length(y); % number of training examples 8 feature_number = size(X,2); % number of feature 9 10 J_history = zeros(num_iters, 1);11 temp = zeros(feature_number, 1);12 13 for iter = 1 : num_iters14 predictions = X * theta;15 sqrError = (predictions - y);16 for i = 1 : feature_number % Simultneously update theta(i) (同时更新)17 temp(i) = theta(i) - (alpha / m) * sum(sqrError .* X(:,i));18 end19 20 for j = 1 : feature_number21 theta(j) = temp(j);22 end23 24 % ====================== YOUR CODE HERE ======================25 % Instructions: Perform a single gradient step on the parameter vector26 % theta. 27 %28 % Hint: While debugging, it can be useful to print out the values29 % of the cost function (computeCostMulti) and gradient here.30 %31 32 % ============================================================33 34 % Save the cost J in every iteration 35 J_history(iter) = computeCostMulti(X, y, theta);36 % disp(J_history(iter));37 38 end39 40 end

 

 1 % Plot the convergence graph 2 figure; 3 plot(1:numel(J_history), J_history, -b, LineWidth, 2); % ‘-b‘--用蓝线绘制图像,线宽为2 4 xlabel(Number of iterations); 5 ylabel(Cost J); 6  7 % Display gradient descents result 8 fprintf(Theta computed from gradient descent: \n); 9 fprintf( %f \n, theta);10 fprintf(\n);
Tip:
To compare how di erent learning learningrates a ect convergence, it‘s helpful to plot J for several learning rateson the same gure. In Octave/MATLAB, this can be done by perform-ing gradi
ent descent multiple times with a `hold on‘ command betweenplots. Concretely, if you‘ve tried three di erent values of alpha (you shouldprobably try more values than this) and stored the costs in J1, J2 andJ3, you can use the following commands to plot them on the same gure:plot(1:50, J1(1:50), `b‘);hold on;plot(1:50, J2(1:50), `r‘);plot(1:50, J3(1:50), `k‘);The nal arguments `b‘, `r‘, and `k‘ specify di erent colors for theplots.
 1 % 如,可以添加本段代码进行比较 不同的learning rate 2 figure; 3 plot(1:100, J_history(1:100), ‘-b‘, ‘LineWidth‘, 2); 4 xlabel(‘Number of iterations‘); 5 ylabel(‘Cost J‘); 6  7 % Compare learning rate 8 hold on; 9 alpha = 0.03;10 theta = zeros(3, 1);11 [theta, J_history1] = gradientDescentMulti(X, y, theta, alpha, num_iters);12 plot(1:100, J_history1(1:100), ‘r‘, ‘LineWidth‘, 2);13 14 hold on;15 alpha = 0.1;16 theta = zeros(3, 1);17 [theta, J_history2] = gradientDescentMulti(X, y, theta, alpha, num_iters);18 plot(1:100, J_history2(1:100), ‘g‘, ‘LineWidth‘, 2);

 

 1 % 利用梯度下降算法预测新值 2 price = [1, X(1:2)] * theta;   %利用矩阵乘法--预测多特征下的price 3  4 % ============================================================ 5  6 fprintf([Predicted price of a 1650 sq-ft, 3 br house  ... 7          (using gradient descent):\n $%f\n], price); 8  9 fprintf(Program paused. Press enter to continue.\n);10 pause;
 1 %% ================ Part 3: Normal Equations ================ 2 %利用正规方程预测新值(Normal Equation) 3 fprintf(Solving with normal equations...\n); 4  5 %% Load Data 6 data = http://www.mamicode.com/csvread(ex1data2.txt); 7 X = data(:, 1:2); 8 y = data(:, 3); 9 m = length(y);10 11 % Add intercept term to X12 X = [ones(m, 1) X];13 14 % Calculate the parameters from the normal equation15 theta = normalEqn(X, y);
 % normalEquation的实现
1
function [theta] = normalEqn(X, y) 2 3 theta = zeros(size(X, 2), 1); 4 6 % Instructions: Complete the code to compute the closed form solution 7 % to linear regression and put the result in theta. 8 9 theta = pinv(X * X) * X * y;10 11 end
 1 % Display normal equation‘s result 2 fprintf(Theta computed from the normal equations: \n); 3 fprintf( %f \n, theta); 4 fprintf(\n); 5  6  7 % Estimate the price of a 1650 sq-ft, 3 br house 8  9 price = 0; 10 price = [1, X(1:2)] * theta;    %利用正规方程预测新值11 12 13 fprintf([Predicted price of a 1650 sq-ft, 3 br house  ...14          (using normal equations):\n $%f\n], price);

 

Linear regression with multiple variables(多特征的线型回归)算法实例_梯度下降解法(Gradient DesentMulti)以及正规方程解法(Normal Equation)