机器学习--线性回归和多元线性回归编程作业总结

1、单变量线性回归预测模型


数据操作

data(:,1)返回数据第一列

length (a)

返回对象a的长度。

空对象的长度为0,标量为1,矢量元素的数量。 对于矩阵或N维对象,长度是沿最大维度的元素数量(等于max(size(a)))

zero

系统函数

linspace (start, end, n)

在开始和结束之间返回具有n个线性间隔元素的行向量。
如果元素的数量大于1,那么端点的开始和结束总是包含在范围内。 如果start大于end,则元素按降序存储。 如果未指定点数,则使用值100。
当起始和结束都是标量时,linspace函数返回一个行向量。 如果其中一个或两个输入是向量,则linspace将它们转换为列向量并返回一个矩阵,其中每行是开始(row_n),结束(row_n)之间的独立序列。

为了与MATLAB兼容,请求只有一个值(n = 1)时返回第二个参数(结束)

logspace (a, pi, n)

返回具有n个元素的行向量,对数地从10 ^ a到10 ^ b间隔开。
如果n未指定,则默认为50。
如果b等于pi,则这些点在10 ^ a和pi之间,而不是10 ^ a和10 ^ pi,以便与相应的MATLAB函数兼容。

同样为了与MATLAB兼容,当请求单个值时,返回范围的右侧(10 ^ b)


contour (x, y, z, vn)

创建一个二维轮廓图。
使用由contourc根据相同自变量计算出的轮廓矩阵c绘制矩阵z的等级曲线(等高线) 请参阅后者的解释。
轮廓线的外观可以使用与样式相同的线型样式来定义。 只使用线条样式和颜色; 任何由风格定义的标记都会被忽略。
如果第一个参数hax是一个轴手柄,那么绘制到这个轴上,而不是由gca返回的当前轴。
可选输出c包含contourc格式的轮廓等级。

可选返回值h是包含轮廓线的hggroup的图形句柄。

surf (hax, …)

绘制三维表面网格。
表面网格使用阴影矩形绘制。矩形[x,y]的顶点通常是meshgrid的输出。在x-y平面中的2-D矩形区域上。 z确定每个顶点平面上方的高度。如果只给出一个z矩阵,则它绘制在网格x = 1:列(z),y = 1:行(z)上。因此,z的列对应于不同的x值,而z的行对应于不同的y值。
通过对z值进行线性缩放以适合当前颜色图的范围来计算曲面的颜色。使用caxis和/或更改颜色表来控制外观。
可选地,可以通过提供颜色矩阵c来独立于z指定表面的颜色。
任何属性/值对都直接传递给底层表面对象。
如果第一个参数hax是一个轴手柄,那么绘制到这个轴上,而不是由gca返回的当前轴。
可选的返回值h是创建的曲面对象的图形句柄。
注意:可以使用阴影命令或使用设置来控制曲面对象属性来控制曲面的确切外观。

ones (m, n)

如果使用两个或多个标量整数参数或整数值向量调用,则返回具有给定维度的数组。

figure

为绘图创建一个新的数字窗口


自定义函数

computeCost(x,y,theta)代价函数的约束条件,计算代价函数的值

 gradientDescent(X, y, theta, alpha, iterations)梯度下降的约束条件,计算theta和梯度下降过程中代价函数J


1、导入数据 

data = load('ex1data1.txt');

2、变量赋值

X = data(:, 1); y = data(:, 2);

m = length(y); 

3、画散点图

plotData(X, y);

    定义plotData(x,y)函数

            figure;%打开新的数据

            plot(x,y,'rx','MarkerSize',10);%散点图定义

            ylabel('Profit in $10,000s');%x轴坐标轴

            xlabel('Population of City in 10,000s');%y轴坐标轴



4、梯度下降

    

        X = [ones(m, 1), data(:,1)]; % Add a column of ones to x,矩阵变换,对X变量添加X0项,数值为1

        theta = zeros(2, 1); % initialize fitting parameters, θ初始赋值,赋值初始值为0

        iterations = 1500;

        alpha = 0.01;

        J = computeCost(X, y, theta);%定义代价函数computeCost(x,y,theta)

           函数定义如下(定义了J函数的约束条件)

            m = length(y);

            J = 0;

             temp = sum((X*theta - y).^2);  

             J = temp / (2*m); 

             end

        

        

        theta = gradientDescent(X, y, theta, alpha, iterations);%梯度下降计算theta

          函数定义如下 ,梯度下降

                function [theta, J_history] = gradientDescentMulti(X, y, theta, alpha, num_iters)

                m = length(y)

                J_history = zeros(num_iters, 1);

                for iter = 1:num_iters

                thetaTemp = theta;  

                for i = 1: size(X,2)  
                      theta(i) = thetaTemp(i)-alpha/m*sum((X*thetaTemp-y).*X(:,i));  
                end  

                 J_history(iter) = computeCostMulti(X, y, theta);

                end

                end

    hold on; % keep previous plot visible,增加预测回归线
    plot(X(:,2), X*theta, '-')

     

5、预测   

     predict1 = [1, 3.5] *theta;%定义预测值

        fprintf('For population = 35,000, we predict a profit of %f\n',...

     predict1*10000);%输出预测值

6、画梯度下降过程中theta的下降曲线

定义画图的横坐标和纵坐标的范围

% Grid over which we will calculate J

theta0_vals = linspace(-10, 10, 100);
theta1_vals = linspace(-1, 4, 100);

初始化J_vals
% initialize J_vals to a matrix of 0's
J_vals = zeros(length(theta0_vals), length(theta1_vals));

计算J_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('\theta_0'); ylabel('\theta_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('\theta_0'); ylabel('\theta_1');
hold on;
plot(theta(1), theta(2), 'rx', 'MarkerSize', 10, 'LineWidth', 2);




2、梯度下降计算多元线性回归

自定义归一化函数[X mu sigma] = featureNormalize(X);

自定义代价函数comupteCostMulti(x,y,theta)

自定义梯度下降函数[theta, J_history] = gradientDescentMulti(X, y, theta, alpha, num_iters);


1、导入数据,变量命名

data = load('ex1data2.txt');
X = data(:, 1:2);
y = data(:, 3);

m = length(y);

2、输出前10行数据

fprintf(' x = [%.0f %.0f], y = %.0f \n', [X(1:10,:) y(1:10,:)]');

3、数据归一化

[X mu sigma] = featureNormalize(X);

4、增加x0,初始值为1

X = [ones(m, 1) X];

5、梯度下降赋值初始化,以及梯度下降

alpha = 0.01;
num_iters = 400;

% Init Theta and Run Gradient Descent 

theta = zeros(3, 1);

[theta, J_history] = gradientDescentMulti(X, y, theta, alpha, num_iters);

            梯度下降函数

            function [theta, J_history] = gradientDescentMulti(X, y, theta, alpha, num_iters)

            m = length(y);

            J_history = zeros(num_iters, 1);

            for iter = 1:num_iters

            thetaTemp = theta;  

            for i = 1: size(X,2)  
                  theta(i) = thetaTemp(i)-alpha/m*sum((X*thetaTemp-y).*X(:,i));  

            end  

            J_history(iter) = computeCostMulti(X, y, theta);

            end

            end


        在梯度下降过程中调用了代价函数comupteCostMulti(x,y,theta)函数,函数如下

          function J = computeCostMulti(X, y, theta)

           m = length(y);

            J = 0;

            temp = sum((X*theta - y).^2);  

            J = temp / (2*m); 

            end

6、输出迭代过程中代价函数变化

figure;
plot(1:numel(J_history), J_history, '-b', 'LineWidth', 2);
xlabel('Number of iterations');

ylabel('Cost J');

7、预测变量面积是1650平方英尺的房子,房子有三个卧室的价格

先进行归一化处理,再添加常数1,最后与theta乘积计算预测变量

X1=[1650,3];
X2=(X1-mu)./sigma;
X3 = [1 X2];
price1=X3*theta;


3、使用正规方程方法计算多元回归

pinv (x)

返回x的Moore-Penrose伪逆

自定义normalEqn函数

function [theta] = normalEqn(X, y)

theta = zeros(size(X, 2), 1);

theta=pinv(X'*X)*X'*y

end


1、导入数据,命名变量,X想增加常数项X1=1

data = csvread('ex1data2.txt');
X = data(:, 1:2);
y = data(:, 3);
m = length(y);

% Add intercept term to X

X = [ones(m, 1) X];


2、计算theta

theta = normalEqn(X, y);

3、预测结果

X4=[1 1650 3]

price2=X4*theta


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值