吴恩达 Octave上多元(以二元为例)线性回归算法实现

  • 基本思路

  • Octave类编程语言的实现

  • 实现线性回归使用的基本命令

程序的目标: 对一个含有多个影响因素的输出值, 分别算出每个影响因素的影响程度(即权重),举个栗子,一栋房子的售价,取决于有几层楼高,房子有多大,周边是否有地铁,是否是学区房等因素
此处使用 y=c0+c1x1+c2x2+...多项式的形式,c0,c1,c2分别为每一项的权重,权重越大,影响越高



1. 基本思路

  • 输入原始数据值
    x数组和y

在这里插入图片描述

对数据进行特征标准化处理,避免因为数据差异过大导致权重失衡(这里用standard deviation normalization)
人工智能/特征标准化

  • 按照多元线性回归算法,配置好学习率alpha,0.01~0.03,训练循环次数num_iters 6000~10000
    在这里插入图片描述
  • 查询每次训练后代价函数J的变化,应该是逐渐变小,调大alpha可以加快下降速度,若变大,应该适当调小alpha, 调节幅度可以参考为3倍左右
  • 对每个参数的系数进行观察,判断哪个相对重要

2.实现过程

  • 导入数据
data=load('ex1data2.txt');   %导入
x=data(:,1:2);  %前两列数为x数组
y=data(:,3);    %第三列为y
m=length(y);
  • 特征标准化处理
function [x_norm, mu, sigma] = featureNormalize(x)
x_norm= x;
mu =zeros(1,size(x,2));
sigma =zeros(1,size(x,2));

mu= mean(x);
sigma=std(x);
x_norm = (x- repmat(mu,size(x,1),1)/repmat(sigma,size(x,1),1);
end
  • 输入多元线性回归计算公式
    111111
function [theta, J_history] = gradientDescentMulti(x, y, theta, alpha, num_iters)

theta=zeros(3,1);
m =length(y);

for iter=1:num_iters
   theta=theta - alpha/m *x '*(x*theta-y);   %核心,迭代计算theta三个参数
   J_history(iter)=computeCostMulti(x,y,theta);
end
end
alpha =0.01;
num_iters =8500;
theta=zeros(3,1);
x= (ones(length(x),1),x)  %x输入数列左边加一列1,作为x0,一定要加偏置
[theta_0, J_history] = gradientDescentMulti(x, y, theta, alpha, num_iters)

3. 基本命令

  • size函数
>>size([1,2;3,4;5,6]);
=> [3,2]  % 返回行数和列数
>>size([1,2;3,4;5,6],2);
>2 %返回第二个维度——列数
  • mean函数
mean(X); %返回X的算术平均值,(默认)
% 若X为矩阵,返回每一列的算术平均值,返回一行数
  • repmat函数
repmat(x,n) %x的行和列分别扩充n倍 ,x为数列同理平铺
repmat(1,3) % 1 1 1;1 1 1;1 1 1 
repmat(x,m,n) %分别把x的行和列扩充m倍和n倍
repmmat([2,3],1,2) % [2,3;2,3]
  • std函数
std(x) %返回x的标准差

新手上道,挂一漏万,请各位大佬不吝赐教
如果觉得有帮助,还希望点个赞哦,
大家的鼓励是我前进的动力,加油!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值