机器学习之 LinearRegression 线性回归

一、预测

先来看看这样一个场景:

假如你手头有一套房子要出售,你咨询了房产中介。中介跟你要了一系列的数据,例如房子面积、位置、楼层、年限等,然后进行一系列计算后,给出了建议的定价。

房产中介是如何帮你定价的?

“中介”通过他多年的“从业”经验,知道哪些因素会影响房子的价格,且知道各自的“影响”有多大,于是在接过“你的房子”时,他就能通过自已的经验计算出“价格”了。

当然,这个价格,不同的中介,得到的也不同。有经验的中介,可以很准确的预测到价格。而经验不足者,可以会有很大的偏差。

注意上面引号内的东西。将引号内的东西做如下抽象:

中介 ——> 模型
从业 ——> 学习
影响 ——> 权重
房子 ——> 样本
价格 ——> 输出

这便可以当作是一个线性回归模型。

二、线性回归

线性回归,用于解决数值预测问题。

1、模型假设

假设有一类数据样本(x,y),x表示一个样本的特征,y表示该样本的值。

假设希望用下面的表达式来近似的表示x和y的关系:

$
h_\theta(x) = \theta^TX
$

显然,只需要求解\(\theta\)的值便可以。

\(\theta\)应该怎么求?

2、梯度下降算法

2.1 直观理解梯度下降

上述的问题,归结到求\(\theta\)。

求取\(\theta\),可否这样处理:先随机定一组\(\theta\)值,然后将已知的样本代入进去,看看得到什么值,然后与样本y值相比较,若它比y大,就减少\(\theta\),若它比y小,就增加\(\theta\)。

显然是OK的,但关键是\(\theta\)每次要变化多大的量合适?当然了,每次就修改一点点,例如0.00000000001,然后修改了100年,终于得到一个合适的参数,这样理论上也是可以的。

那有没有什么办法,可以让\(\theta\) “快速的变化”到理想状态呢?

注意引号内的文字,想到什么没?是的,变化率!

数学上来讲,是求导!

用谁对谁求?当然是计算值与y之前误差了。

有了变化率,\(\theta\)要变大,还是变小?

梯度下降算法认为,往梯度反方向变化,即是做减法。

2.2 梯度下降法计算过程

误差函数

令误差函数如下式:

$
J = \frac{1}{2m} \sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})^2
$

这个式子,解释一下。

误差用输出值与y值作差,这个没得说。平方是让差值恒为正。而前方的1/2,是为了求导时将平方约去,简化运算。

求导

J对\(\theta\)偏导数为

$
grad = \frac{1}{m} \sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}
$

更新\(\theta\)

由梯度下降法,迭代计算\(\theta\)的值,其中\(\alpha\)为学习率

$
\theta_j :=\theta_j - \alpha*grad
$

三、单一特征的线性回归

1、数据可视化

fprintf('Plotting Data ...\n')
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.\n');
pause;

2、误差函数及测试

2.1、误差函数

根据公式,编写J函数

function J = computeCost(X, y, theta)
m = length(y); % number of training examples

% J=1/(2*m)*sum((X*theta-y).^2); 

J=1/(2*m)*(X*theta-y)'*(X*theta-y);

end

2.2、测试误差函数

X = [ones(m, 1), data(:,1)]; % Add a column of ones to x (x_0 = 1)
theta = zeros(2, 1); % initialize fitting parameters

% Some gradient descent settings
iterations = 1500;
alpha = 0.01;

fprintf('\nTesting the cost function ...\n')
% compute and display initial cost
J = computeCost(X, y, theta);
fprintf('With theta = [0 ; 0]\nCost computed = %f\n', J);
fprintf('Expected cost value (approx) 32.07\n');

% further testing of the cost function
J = computeCost(X, y, [-1 ; 2]);
fprintf('\nWith theta = [-1 ; 2]\nCost computed = %f\n', J);
fprintf('Expected cost value (approx) 54.24\n');

fprintf('Program paused. Press enter to continue.\n');
pause;

3、梯度下降

3.1、梯度下降算法

根据梯度下降公式,实现算法

function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters)
m = length(y); % number of training examples
J_history = zeros(num_iters, 1);  % one column

for iter = 1:num_iters
    grad = 1/m * X'*(X*theta-y);
    theta = theta - alpha * grad;
    J_history(iter) = computeCost(X, y, theta);
end
endfprintf('\nRunning Gradient Descent ...\n')
% run gradient descent
theta = gradientDescent(X, y, theta, alpha, iterations);

% print theta to screen
fprintf('Theta found by gradient descent:\n');
fprintf('%f\n', theta);
fprintf('Expected theta values (approx)\n');
fprintf(' -3.6303\n  1.1664\n\n');

3.2、运行梯度下降

传入训练集,计算出theta矩阵

fprintf('\nRunning Gradient Descent ...\n')
% run gradient descent
theta = gradientDescent(X, y, theta, alpha, iterations);

% print theta to screen
fprintf('Theta found by gradient descent:\n');
fprintf('%f\n', theta);
fprintf('Expected theta values (approx)\n');
fprintf(' -3.6303\n  1.1664\n\n');

4、预测

根据计算出来的theta矩阵,预测新的样本对应的值。

% 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\n',...
    predict1*10000);

predict2 = [1, 7] * theta;
fprintf('For population = 70,000, we predict a profit of %f\n',...
    predict2*10000);

四、多特征的线性回归

多特征的线性回归,算法与单一特征基本一样,唯一不同的仅仅是X的特征数量、theta的参数数量。

另外,多特征的样本,各个特征的数据范围可能存在数量级的差别,最后得出的误差函数的等高线可能是一个不规则的图形。而梯度下降,是沿着误差函数的等高线的法向方向进行,对于一个不规则的图形,其法向方向是多变的,这样一来,梯度下降可能每次迭代的方向都会有差别,进而形成震荡,迭代速度也会变慢。

为使算法更快的找到最优解,使用“均值归一化”的进行标准化处理,将样本各个特征的数据,约束在相同的范围内。这样处理后,如果是二维特征,其误差函数的等高线就是一个近圆,梯度下降就直指圆心进行,能更快找到最优解。

1、标准化特征

1.1、 加载数据,并标准化处理

%% 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: \n');
fprintf(' x = [%.0f %.0f], y = %.0f \n', [X(1:10,:) y(1:10,:)]');

fprintf('Program paused. Press enter to continue.\n');
pause;

% Scale features and set them to zero mean
fprintf('Normalizing Features ...\n');

% 将特征的值,都约束在[-1,1]区间内

[X mu sigma] = featureNormalize(X);

% Add intercept term to X??X_0 = 1
X = [ones(m, 1) X];

1.2、标准化函数(使用均值归一化算法)

计算方法:X_out = (X_in - mu)/sigma,其中,mu为样本均值,sigma为样本标准差

function [X_norm, mu, sigma] = featureNormalize(X)
X_norm = X;
mu = zeros(1, size(X, 2));   % get the count of column
sigma = zeros(1, size(X, 2));
[X_norm,mu,sigma] = zscore(X);
end

2、多维特征样本的误差函数、梯度下降算法

与一维样本的公式完全一样。不再详述。

五、正规方程解法

求解theta,除了使用梯度下降法外,还可以直接使用公式,进行计算。

上面讲到,如果是多维数据,在进行梯度下降时,为使计算速度加快,需要将多维特征数据进行标准化处理。而若是使用正规方程解法,则不需要,在原有的样本进行计算即可。

正规方程解法,因为需要求解逆矩阵,在样本数量很大的情况下,其运算速度会非常慢,所以,梯度下降法与正规方程解法,根据数据量的大小,进行选择。

经验数值是,当数据量大于1,000,000时,一般采用梯度下降法。

1、方程解法

function [theta] = normalEqn(X, y)

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

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

end

2、预测

可以看到,正规方程解法,与梯度下降法,得出来的结果很接近。

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: \n');
fprintf(' %f \n', theta);
fprintf('\n');

% Estimate the price of a 1650 sq-ft, 3 br house
% ====================== YOUR CODE HERE ======================
% price = 0; % You should change this

price = 1650; % You should change this
price = [1,1650,3]*theta;

原文地址:https://www.cnblogs.com/Fordestiny/p/8534470.html

时间: 2024-10-25 18:46:59

机器学习之 LinearRegression 线性回归的相关文章

机器学习入门:线性回归及梯度下降

机器学习入门:线性回归及梯度下降 本文会讲到: (1)线性回归的定义 (2)单变量线性回归 (3)cost function:评价线性回归是否拟合训练集的方法 (4)梯度下降:解决线性回归的方法之一 (5)feature scaling:加快梯度下降执行速度的方法 (6)多变量线性回归   Linear Regression 注意一句话:多变量线性回归之前必须要Feature Scaling! 方法:线性回归属于监督学习,因此方法和监督学习应该是一样的,先给定一个训练集,根据这个训练集学习出一个

机器学习(2)之线性回归

机器学习(2)之线性回归 上一章介绍了梯度下降算法的线性回归,本章将介绍另外一种线性回归,它是利用矩阵求导的方式来实现梯度下降算法一样的效果. 1. 矩阵的求导 首先定义表示m×n的矩阵,那么对该矩阵进行求导可以用下式表示,可以看出求导后的矩阵仍然为m×n 这里要用到矩阵迹的特性,trace. 对于一个n阶的方阵(n×n),它的迹(tr)为对角线元素之和: 1. 对于一个实数,它的迹即为它本身 tr a = a 2. 如果AB是一个方阵,那么 tr AB = tr BA 3. 由此可推导出 tr

机器学习入门实践——线性回归&非线性回归&mnist手写体识别

把一本<白话深度学习与tensorflow>给啃完了,了解了一下基本的BP网络,CNN,RNN这些.感觉实际上算法本身不是特别的深奥难懂,最简单的BP网络基本上学完微积分和概率论就能搞懂,CNN引入的卷积,池化等也是数字图像处理中比较成熟的理论,RNN使用的数学工具相对而言比较高深一些,需要再深入消化消化,最近也在啃白皮书,争取从数学上把这些理论吃透 当然光学理论不太行,还是得要有一些实践的,下面是三个入门级别的,可以用来辅助对BP网络的理解 环境:win10 WSL ubuntu 18.04

机器学习之多变量线性回归(Linear Regression with multiple variables)

1. Multiple features(多维特征) 在机器学习之单变量线性回归(Linear Regression with One Variable)我们提到过的线性回归中,我们只有一个单一特征量(变量)--房屋面积x.我们希望使用这个特征量来预测房子的价格.我们的假设在下图中用蓝线划出: 不妨思考一下,如果我们不仅仅知道房屋面积(作为预测房屋价格的特征量(变量)),我们还知道卧室的数量.楼层的数量以及房屋的使用年限,那么这就给了我们更多可以用来预测房屋价格的信息. 即,支持多变量的假设为:

从统计看机器学习(一) 一元线性回归

从统计学的角度来看,机器学习大多的方法是统计学中分类与回归的方法向工程领域的推广. “回归”(Regression)一词的滥觞是英国科学家Francis Galton(1822-1911)在1886年的论文[1]研究孩子身高与父母身高之间的关系.观察1087对夫妇后,得出成年儿子身高=33.73+0.516*父母平均身高(以英寸为单位).他发现孩子的身高与父母的身高相比更加温和:如果父母均非常高,那么孩子身高更倾向于很高但比父母矮:如果父母均非常矮,那么孩子身高更倾向于很矮但比父母高.这个发现被

机器学习知识体系 - 线性回归

机器学习 什么是机器学习?业界有如下定义: ? ArthurSamuel(1959).MachineLearning:Fieldof study that gives computers the ability to learn without being explicitly programmed. ? TomMitchell(1998)Well-posed Learning Problem: A computer program is said to learn from experienc

机器学习:多变量线性回归

************************************** 注:本系列博客是博主学习Stanford大学 Andrew Ng 教授的<机器学习>课程笔记.博主深感学过课程后,不进行总结很容易遗忘,根据课程加上自己对不明白问题的补充遂有此系列博客.本系列博客包括线性回归.逻辑回归.神经网络.机器学习的应用和系统设计.支持向量机.聚类.将维.异常检测.推荐系统及大规模机器学习等内容. ************************************** 多变量线性回归 多

机器学习二(线性回归和Logistic回归)

前言 由于本部分内容讲解资源较多,本文不做过多叙述,重点放在实际问题的应用上. 一.线性回归 线性回归中的线性指的是对于参数的线性的,对于样本的特征不一定是线性的. 线性模型(矩阵形式):y=XA+e 其中:A为参数向量,y为向量,X为矩阵,e为噪声向量. 对于线性模型,通常采用最小二乘法作为其解法(可通过最大似然估计推得). 最小二乘法是通过最小化误差的平方和寻找数据的最佳函数匹配. 最小二乘法的解法有很多种,通常有: 解析法即求通过函数的导数为0确定函数的极值点 矩阵法---解析法的矩阵形式

机器学习入门三------线性回归

线性回归 线性回归是一种找到最适合一组点的直线或超平面的方法.本模块会先直观介绍线性回归,为介绍线性回归的机器学习方法奠定基础. 人们早就知晓,相比凉爽的天气,蟋蟀在较为炎热的天气里鸣叫更为频繁.数十年来,专业和业余昆虫学者已将每分钟的鸣叫声和温度方面的数据编入目录.Ruth 阿姨将她喜爱的蟋蟀数据库作为生日礼物送给您,并邀请您自己利用该数据库训练一个模型,从而预测鸣叫声与温度的关系. 首先建议您将数据绘制成图表,了解下数据的分布情况: 图 1. 每分钟的鸣叫声与温度(摄氏度)的关系. 毫无疑问