LinearRegression 线性回归
一、预测
先来看看这样一个场景:
假如你手头有一套房子要出售,你咨询了房产中介。中介跟你要了一系列的数据,例如房子面积、位置、楼层、年限等,然后进行一系列计算后,给出了建议的定价。
房产中介是如何帮你定价的?
“中介”通过他多年的“从业”经验,知道哪些因素会影响房子的价格,且知道各自的“影响”有多大,于是在接过“你的房子”时,他就能通过自已的经验计算出“价格”了。
当然,这个价格,不同的中介,得到的也不同。有经验的中介,可以很准确的预测到价格。而经验不足者,可以会有很大的偏差。
注意上面引号内的东西。将引号内的东西做如下抽象:
中介 ——> 模型
从业 ——> 学习
影响 ——> 权重
房子 ——> 样本
价格 ——> 输出
这便可以当作是一个线性回归模型。
二、线性回归
线性回归,用于解决数值预测问题。
1、模型假设
假设有一类数据样本\((x,y)\),\(x\) 表示一个样本的特征集\((x_0,x_1,x_2,...,x_n)\),\(y\) 表示该样本的值。
假设 \(y\) 与 \(x\) 之间,存在某种线性关系,那么数学上,可以用如下方程表示:
\(
h(x) = \theta_0x_0 + \theta_1x_1 + ...+ \theta_nx_n
\)
用矩阵表示为:
\(
h_\theta(x) = \theta^TX
\)
显然,要确定 \(x\) 与 \(y\) 之间的关系,只需要求解 \(\theta\) 的值便可以。
那么,\(\theta\) 应该怎么求?
2、梯度下降算法
2.1 直观理解梯度下降
上述的问题,归结到求 \(\theta\)。
求取 \(\theta\),可否这样处理:先随机定一组 \(\theta\) 值,然后将已知的样本代入模型公式中,得到输出的 \(h\)值,然后与样本 \(y\) 值相比较,若 \(h\) 比 \(y\) 大,就减少 \(\theta\),若 \(h\) 比 \(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;
LinearRegression 线性回归的更多相关文章
- 编程作业1.1——sklearn机器学习算法系列之LinearRegression线性回归
知识点 scikit-learn 对于线性回归提供了比较多的类库,这些类库都可以用来做线性回归分析. 我们也可以使用scikit-learn的线性回归函数,而不是从头开始实现这些算法. 我们将scik ...
- Python机器学习/LinearRegression(线性回归模型)(附源码)
LinearRegression(线性回归) 2019-02-20 20:25:47 1.线性回归简介 线性回归定义: 百科中解释 我个人的理解就是:线性回归算法就是一个使用线性函数作为模型框架($ ...
- 机器学习之路: python 线性回归LinearRegression, 随机参数回归SGDRegressor 预测波士顿房价
python3学习使用api 线性回归,和 随机参数回归 git: https://github.com/linyi0604/MachineLearning from sklearn.datasets ...
- Python----简单线性回归
简单线性回归 1.研究一个自变量(X)和一个因变量(y)的关系 简单线性回归模型定义:y=β0+β1x+ε 简单线性回归方程:E(y)=β0+β1x 其中: β0为回归线的截距 β1为回归线的斜率 ...
- sklearn 线性回归
# import numpy as np import pandas as pd from pandas import Series,DataFrame import matplotlib.pyplo ...
- 机器学习-Sklearn
Scikit learn 也简称 sklearn, 是机器学习领域当中最知名的 python 模块之一. Sklearn 包含了很多种机器学习的方式: Classification 分类 Regres ...
- 机器学习常用sklearn库
Sklearn.model_selection(模型选择) Cross_val_score:交叉验证 Train_test_split:数据切割 GridsearchCV:网格搜索 Sklearn.m ...
- 【学习笔记】sklearn数据集与估计器
数据集划分 机器学习一般的数据集会划分为两个部分: 训练数据:用于训练,构建模型 测试数据:在模型检验时使用,用于评估模型是否有效 训练数据和测试数据常用的比例一般为:70%: 30%, 80%: 2 ...
- 数学建模:1.概述& 监督学习--回归分析模型
数学建模概述 监督学习-回归分析(线性回归) 监督学习-分类分析(KNN最邻近分类) 非监督学习-聚类(PCA主成分分析& K-means聚类) 随机算法-蒙特卡洛算法 1.回归分析 在统计学 ...
随机推荐
- BZOJ 2064: 分裂 [DP 状压 转化]
传送门 题意:一开始$n$块面积最后$m$块面积,面积和相等每次可以分裂或者合并,问最少几次 昨天忘发了... 不会.... 考虑最差情况,$n+m-2$所有先合并再分裂 发现只有当前后两个子集相等时 ...
- 利用Lua读写本地文件
缘由 今天在使用Lua编写脚本时,需要用到读写文件的操作,很久没有使用Lua了,特写下此文来备忘一下. 简介 Lua对文件的操作与C对文件的操作基本一致,不管是参数还是方法.Lua中可以直接通过全局方 ...
- location对象浅探
- shell的if嵌套
shell脚本编写中,if是可以嵌套的, 注意,if条件表达式[]中的空格,以及后面的then就行了 if条件表达式后面的分号":"可有可无,不影响. 代码如下 myFile='c ...
- MySql主键自动生成,表、实体、C#调用方法
1.表:mysql建表语句 DROP TABLE IF EXISTS `keycode`; CREATE TABLE `keycode` ( `Id` ) NOT NULL AUTO_INCREMEN ...
- python 两个list 求交集,并集,差集
def diff(listA,listB): #求交集的两种方式 retA = [i for i in listA if i in listB] retB = list(set(listA).inte ...
- 原生ajax写的上拉加载
上拉加载的思路 1 上拉加载是要把屏幕拉到最底部的时候触发ajax事件请求数据 2.所有要获取屏幕的高度 文档的高度 和滚动的高度 下面的代码是已经做好了兼容的可以直接拿来用 Javascript: ...
- java 堆和栈
转载自 http://blog.csdn.net/peterwin1987/article/details/7571808 博主讲的相当清楚吼吼吼
- Tomcat8.5.24日志自动清理(maxDays)功能探究
前言 测试人员反馈tomcat目录下的日志占用空间很大,需要自动清理.接到这个反馈时,想象着应该是一个很简单的功能,tomcat应该已经实现了日志的自动清理功能.于是乎,我先到网上查询了如何自动清除t ...
- Pymongo一些常见需求(陆续补充)
总结一下最近包括之前遇到的一些pymongo操作的问题. #需求1: 搜索文档数组里边是否存在某元素 数据: data1 = { '_id': xxxxxxxxxxxxxx, 'dataList': ...