zoukankan      html  css  js  c++  java
  • 机器学习第二周编程作业

    单变量线性回归:

    • ex1.m
    • plotData.m
    • computerCost.m
    • gradientDescent.m

    多变量线性回归:

    • ex1_multi.m
    • featureNormalize.m
    • computerCostMulti.m
    • gredientDescentMulti.m
    • normalEqn.m

    ex1.m

    %% Machine Learning Online Class - Exercise 1: Linear Regression
    
    %  Instructions
    %  ------------
    %
    %  This file contains code that helps you get started on the
    %  linear exercise. You will need to complete the following functions
    %  in this exericse:
    %
    %     warmUpExercise.m
    %     plotData.m
    %     gradientDescent.m
    %     computeCost.m
    %     gradientDescentMulti.m
    %     computeCostMulti.m
    %     featureNormalize.m
    %     normalEqn.m
    %
    %  For this exercise, you will not need to change any code in this file,
    %  or any other files other than those mentioned above.
    %
    % x refers to the population size in 10,000s
    % y refers to the profit in $10,000s
    %
    
    %% Initialization
    clear ; close all; clc
    
    %% ==================== Part 1: Basic Function ====================
    % Complete warmUpExercise.m
    fprintf('Running warmUpExercise ... 
    ');
    fprintf('5x5 Identity Matrix: 
    ');
    warmUpExercise()
    
    fprintf('Program paused. Press enter to continue.
    ');
    pause;
    
    
    %% ======================= Part 2: Plotting =======================
    fprintf('Plotting Data ...
    ')
    data = load('ex1data1.txt');
    X = data(:, 1); y = data(:, 2);
    m = length(y); % number of training examples
    
    % Plot Data
    % Note: You have to complete the code in plotData.m
    plotData(X, y);
    
    fprintf('Program paused. Press enter to continue.
    ');
    pause;
    
    %% =================== Part 3: Cost and Gradient descent ===================
    
    X = [ones(m, 1), data(:,1)]; % Add a column of ones to x
    theta = zeros(2, 1); % initialize fitting parameters
    
    % Some gradient descent settings
    iterations = 1500;
    alpha = 0.01;
    
    fprintf('
    Testing the cost function ...
    ')
    % compute and display initial cost
    J = computeCost(X, y, theta);
    fprintf('With theta = [0 ; 0]
    Cost computed = %f
    ', J);
    fprintf('Expected cost value (approx) 32.07
    ');
    
    % further testing of the cost function
    J = computeCost(X, y, [-1 ; 2]);
    fprintf('
    With theta = [-1 ; 2]
    Cost computed = %f
    ', J);
    fprintf('Expected cost value (approx) 54.24
    ');
    
    fprintf('Program paused. Press enter to continue.
    ');
    pause;
    
    fprintf('
    Running Gradient Descent ...
    ')
    % run gradient descent
    theta = gradientDescent(X, y, theta, alpha, iterations);
    
    % print theta to screen
    fprintf('Theta found by gradient descent:
    ');
    fprintf('%f
    ', theta);
    fprintf('Expected theta values (approx)
    ');
    fprintf(' -3.6303
      1.1664
    
    ');
    
    % Plot the linear fit
    hold on; % keep previous plot visible
    plot(X(:,2), X*theta, '-')
    legend('Training data', 'Linear regression')
    hold off % don't overlay any more plots on this figure
    
    % Predict values for population sizes of 35,000 and 70,000
    predict1 = [1, 3.5] *theta;
    fprintf('For population = 35,000, we predict a profit of %f
    ',...
        predict1*10000);
    predict2 = [1, 7] * theta;
    fprintf('For population = 70,000, we predict a profit of %f
    ',...
        predict2*10000);
    
    fprintf('Program paused. Press enter to continue.
    ');
    pause;
    
    %% ============= Part 4: Visualizing J(theta_0, theta_1) =============
    fprintf('Visualizing J(theta_0, theta_1) ...
    ')
    
    % Grid over which we will calculate J
    theta0_vals = linspace(-10, 10, 100);
    theta1_vals = linspace(-1, 4, 100);
    
    % initialize J_vals to a matrix of 0's
    J_vals = zeros(length(theta0_vals), length(theta1_vals));
    
    % Fill out J_vals
    for i = 1:length(theta0_vals)
        for j = 1:length(theta1_vals)
    	  t = [theta0_vals(i); theta1_vals(j)];
    	  J_vals(i,j) = computeCost(X, y, t);
        end
    end
    
    
    % Because of the way meshgrids work in the surf command, we need to
    % transpose J_vals before calling surf, or else the axes will be flipped
    J_vals = J_vals';
    % Surface plot
    figure;
    surf(theta0_vals, theta1_vals, J_vals)
    xlabel('	heta_0'); ylabel('	heta_1');
    
    % Contour plot
    figure;
    % Plot J_vals as 15 contours spaced logarithmically between 0.01 and 100
    contour(theta0_vals, theta1_vals, J_vals, logspace(-2, 3, 20))
    xlabel('	heta_0'); ylabel('	heta_1');
    hold on;
    plot(theta(1), theta(2), 'rx', 'MarkerSize', 10, 'LineWidth', 2);
    

    plotData.m

    function plotData(x, y)
    %PLOTDATA Plots the data points x and y into a new figure 
    %   PLOTDATA(x,y) plots the data points and gives the figure axes labels of
    %   population and profit.
    
    figure; % open a new figure window
    plot(x, y, 'rx', 'MarkerSize', 10);
    ylabel('Profit in $10,000s');
    xlabel('Population of City in 10,000s');
    % ====================== YOUR CODE HERE ======================
    % Instructions: Plot the training data into a figure using the 
    %               "figure" and "plot" commands. Set the axes labels using
    %               the "xlabel" and "ylabel" commands. Assume the 
    %               population and revenue data have been passed in
    %               as the x and y arguments of this function.
    %
    % Hint: You can use the 'rx' option with plot to have the markers
    %       appear as red crosses. Furthermore, you can make the
    %       markers larger by using plot(..., 'rx', 'MarkerSize', 10);
    
    
    
    
    
    % ============================================================
    
    end
    

    computerCost.m

    function J = computeCost(X, y, theta)
    %COMPUTECOST Compute cost for linear regression
    %   J = COMPUTECOST(X, y, theta) computes the cost of using theta as the
    %   parameter for linear regression to fit the data points in X and y
    
    % Initialize some useful values
    m = length(y); % number of training examples
    
    % You need to return the following variables correctly 
    J = 0;
    
    % ====================== YOUR CODE HERE ======================
    % Instructions: Compute the cost of a particular choice of theta
    %               You should set J to the cost.
    h = X * theta;
    J = 1/(2*m) * sum((h-y).^2)
    
    
    
    
    % =========================================================================
    
    end
    

      

    gradientDescent.m

    function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters)
    %GRADIENTDESCENT Performs gradient descent to learn theta
    %   theta = GRADIENTDESCENT(X, y, theta, alpha, num_iters) updates theta by 
    %   taking num_iters gradient steps with learning rate alpha
    
    % Initialize some useful values
    m = length(y); % number of training examples
    J_history = zeros(num_iters, 1);
    
    for iter = 1:num_iters
    
        % ====================== YOUR CODE HERE ======================
        % Instructions: Perform a single gradient step on the parameter vector
        %               theta. 
        %
        % Hint: While debugging, it can be useful to print out the values
        %       of the cost function (computeCost) and gradient here.
        %
    tempTheta = theta;
    
    theta(1) = tempTheta(1) - alpha / m * sum(X * tempTheta - y);
    theta(2) = tempTheta(2) - alpha / m * sum((X * tempTheta - y) .*X(:,2));
    
        % ============================================================
    
        % Save the cost J in every iteration    
        J_history(iter) = computeCost(X, y, theta);
    
    end
    
    end
    

     

    ex1_multi.m

    %% Machine Learning Online Class
    %  Exercise 1: Linear regression with multiple variables
    %
    %  Instructions
    %  ------------
    % 
    %  This file contains code that helps you get started on the
    %  linear regression exercise. 
    %
    %  You will need to complete the following functions in this 
    %  exericse:
    %
    %     warmUpExercise.m
    %     plotData.m
    %     gradientDescent.m
    %     computeCost.m
    %     gradientDescentMulti.m
    %     computeCostMulti.m
    %     featureNormalize.m
    %     normalEqn.m
    %
    %  For this part of the exercise, you will need to change some
    %  parts of the code below for various experiments (e.g., changing
    %  learning rates).
    %
    
    %% Initialization
    
    %% ================ Part 1: Feature Normalization ================
    
    %% Clear and Close Figures
    clear ; close all; clc
    
    fprintf('Loading data ...
    ');
    
    %% Load Data
    data = load('ex1data2.txt');
    X = data(:, 1:2);
    y = data(:, 3);
    m = length(y);
    
    % Print out some data points
    fprintf('First 10 examples from the dataset: 
    ');
    fprintf(' x = [%.0f %.0f], y = %.0f 
    ', [X(1:10,:) y(1:10,:)]');
    
    fprintf('Program paused. Press enter to continue.
    ');
    pause;
    
    % Scale features and set them to zero mean
    fprintf('Normalizing Features ...
    ');
    
    [X mu sigma] = featureNormalize(X);
    
    % Add intercept term to X
    X = [ones(m, 1) X];
    
    
    %% ================ Part 2: Gradient Descent ================
    
    % ====================== YOUR CODE HERE ======================
    % Instructions: We have provided you with the following starter
    %               code that runs gradient descent with a particular
    %               learning rate (alpha). 
    %
    %               Your task is to first make sure that your functions - 
    %               computeCost and gradientDescent already work with 
    %               this starter code and support multiple variables.
    %
    %               After that, try running gradient descent with 
    %               different values of alpha and see which one gives
    %               you the best result.
    %
    %               Finally, you should complete the code at the end
    %               to predict the price of a 1650 sq-ft, 3 br house.
    %
    % Hint: By using the 'hold on' command, you can plot multiple
    %       graphs on the same figure.
    %
    % Hint: At prediction, make sure you do the same feature normalization.
    %
    
    fprintf('Running gradient descent ...
    ');
    
    % Choose some alpha value
    alpha = 0.01;
    num_iters = 8500;
    
    % Init Theta and Run Gradient Descent 
    theta = zeros(3, 1);
    [theta, J_history] = gradientDescentMulti(X, y, theta, alpha, num_iters);
    
    % Plot the convergence graph
    figure;
    plot(1:numel(J_history), J_history, '-g', 'LineWidth', 2);
    xlabel('Number of iterations');
    ylabel('Cost J');
    
    % Display gradient descent's result
    fprintf('Theta computed from gradient descent: 
    ');
    fprintf(' %f 
    ', theta);
    fprintf('
    ');
    
    % Estimate the price of a 1650 sq-ft, 3 br house
    % ====================== YOUR CODE HERE ======================
    % Recall that the first column of X is all-ones. Thus, it does
    % not need to be normalized.
    a = (1650 - mu(1,1)) / sigma(1,1)
    b = (3 - mu(1,2)) / sigma(1,2)
    price = [1,a,b] * theta; % You should change this
    
    
    % ============================================================
    
    fprintf(['Predicted price of a 1650 sq-ft, 3 br house ' ...
             '(using gradient descent):
     $%f
    '], price);
    
    fprintf('Program paused. Press enter to continue.
    ');
    pause;
    
    %% ================ Part 3: Normal Equations ================
    
    fprintf('Solving with normal equations...
    ');
    
    % ====================== YOUR CODE HERE ======================
    % Instructions: The following code computes the closed form 
    %               solution for linear regression using the normal
    %               equations. You should complete the code in 
    %               normalEqn.m
    %
    %               After doing so, you should complete this code 
    %               to predict the price of a 1650 sq-ft, 3 br house.
    %
    
    %% Load Data
    data = csvread('ex1data2.txt');
    X = data(:, 1:2);
    y = data(:, 3);
    m = length(y);
    
    % Add intercept term to X
    X = [ones(m, 1) X];
    
    % Calculate the parameters from the normal equation
    theta = normalEqn(X, y);
    
    % Display normal equation's result
    fprintf('Theta computed from the normal equations: 
    ');
    fprintf(' %f 
    ', theta);
    fprintf('
    ');
    
    
    % Estimate the price of a 1650 sq-ft, 3 br house
    % ====================== YOUR CODE HERE ======================
    
    price = [1,1650,3] * theta ; % You should change this
    
    
    % ============================================================
    
    fprintf(['Predicted price of a 1650 sq-ft, 3 br house ' ...
             '(using normal equations):
     $%f
    '], price);
    

      

    featureNormalize.m

    function [X_norm, mu, sigma] = featureNormalize(X)
    %FEATURENORMALIZE Normalizes the features in X 
    %   FEATURENORMALIZE(X) returns a normalized version of X where
    %   the mean value of each feature is 0 and the standard deviation
    %   is 1. This is often a good preprocessing step to do when
    %   working with learning algorithms.
    
    % You need to set these values correctly
    X_norm = X;
    size(X, 2)
    mu = zeros(1, size(X, 2));
    sigma = zeros(1, size(X, 2));
    
    
    % ====================== YOUR CODE HERE ======================
    % Instructions: First, for each feature dimension, compute the mean
    %               of the feature and subtract it from the dataset,
    %               storing the mean value in mu. Next, compute the 
    %               standard deviation of each feature and divide
    %               each feature by it's standard deviation, storing
    %               the standard deviation in sigma. 
    %
    %               Note that X is a matrix where each column is a 
    %               feature and each row is an example. You need 
    %               to perform the normalization separately for 
    %               each feature. 
    %
    % Hint: You might find the 'mean' and 'std' functions useful.
    %       
    
    mu = mean(X);
    sigma = std(X)
    % for i = 1:size(X_norm, 2);    
    %     X_norm(:,i) = (X_norm(:,i) - mu(:,i))/sigma(:,i)
      X_norm  = (X - repmat(mu,size(X,1),1)) ./  repmat(sigma,size(X,1),1);
    %X_norm = (X - mu) ./ sigma 
    
    
    
    
    
    
    
    
    % ============================================================
    
    end
    

      

    computerCostMulti.m

    function J = computeCostMulti(X, y, theta)
    %COMPUTECOSTMULTI Compute cost for linear regression with multiple variables
    %   J = COMPUTECOSTMULTI(X, y, theta) computes the cost of using theta as the
    %   parameter for linear regression to fit the data points in X and y
    
    % Initialize some useful values
    m = length(y); % number of training examples
    
    % You need to return the following variables correctly 
    J = 0;
    
    % ====================== YOUR CODE HERE ======================
    % Instructions: Compute the cost of a particular choice of theta
    %               You should set J to the cost.
    J = sum((X * theta - y).^2) / (2*m);   
    % J = 1 / (2 * m) * sum((X * theta  - y).^2);
    
    
    
    % =========================================================================
    
    end
    

      

    gredientDescentMulti.m

    function [theta, J_history] = gradientDescentMulti(X, y, theta, alpha, num_iters)
    %GRADIENTDESCENTMULTI Performs gradient descent to learn theta
    %   theta = GRADIENTDESCENTMULTI(x, y, theta, alpha, num_iters) updates theta by
    %   taking num_iters gradient steps with learning rate alpha
    
    % Initialize some useful values
    m = length(y); % number of training examples
    J_history = zeros(num_iters, 1);
    
    for iter = 1:num_iters
    
        % ====================== YOUR CODE HERE ======================
        % Instructions: Perform a single gradient step on the parameter vector
        %               theta. 
        %
        % Hint: While debugging, it can be useful to print out the values
        %       of the cost function (computeCostMulti) and gradient here.
        %
    
    tempTheta = theta;
    for i = 1:size(theta,1)
        theta(i) = tempTheta(i) - alpha / m * sum((X * tempTheta  - y) .* X(:,i));
    end 
    
        % ============================================================
    
        % Save the cost J in every iteration    
        J_history(iter) = computeCostMulti(X, y, theta);
    
    end
    
    end
    

      

    normalEqn.m

    function [theta] = normalEqn(X, y)
    %NORMALEQN Computes the closed-form solution to linear regression 
    %   NORMALEQN(X,y) computes the closed-form solution to linear 
    %   regression using the normal equations.
    
    theta = zeros(size(X, 2), 1);
    
    % ====================== YOUR CODE HERE ======================
    % Instructions: Complete the code to compute the closed form solution
    %               to linear regression and put the result in theta.
    %
    
    % ---------------------- Sample Solution ----------------------
    
    theta = (X' * X)  X' * y;
    
    
    % -------------------------------------------------------------
    
    
    % ============================================================
    
    end
    

      

  • 相关阅读:
    《精通.NET互操作1.2》C# PInvoke使用c++dll
    WPF的dataGrid基本用法
    C#中$的用法
    ASP.NET WebApi 实现Token验证
    Ajax请求WebAPI传递多参数的方法
    ajax调用ASP.NET MVC控制器传递参数
    js子窗口调用父窗口函数并传递对象给父窗口的方法
    H5本地存储和本地数据库
    非对称加密RSA的C#实现
    在Unity3D项目中接入ShareSDK实现安卓平台微信分享功能(可使用ShareSDK默认UI或自定义UI)
  • 原文地址:https://www.cnblogs.com/weiququ/p/8000969.html
Copyright © 2011-2022 走看看