一、先弄清楚机器学习的几个概念:
- 训练集:训练样本,每个样本都由表示要学习的特征集(输入变量)和目标(输出变量)
设训练样本数为m
- 输入特征\变量input : x 其中每个样本用 表示(第i个样本),样本中每个特征/输入用表示(第i个样本中的第j个特征)
- 输出特征/变量output : y 其中每个样本用 表示(第i个样本),每个样本只有一个输出。
- 更新参数/权值 weight : theat 每个输入x对应一个theta, 用表示
因此第i个样本集用表示。
二、监督的机器学习算法主要分为这三个部分:
1. 假设函数:(无法直接插入公式啊,就不费劲了,这些公式网上很容易找到)
2. 花费函数:以参数theta为自变量,根据假设函数求出训练集的每对数据的值与真实值的差值做比较,依据某一标准函数,最小化这个花费函数
最小二乘法(min square): 差值的平方和最小(最常用的方法), 因为它是一个碗状的凹进去的误差曲面,花费函数即是误差函数的另一种表达
3. 优化方法:不同的优化方法有不同的权值更新,通过权值更新来更新假设函数,从而使花费函数最小化
梯度下降法:沿着误差曲线或曲面的梯度方向,更新权值, 即权值的更新是基于梯度更新的。用公式表示为:。其中表示误差曲面的梯度,表示下降速度(学习速度)。在多维向量中,梯度也是一个向量,有方向和大小,这个公式说明权值就沿着这个方向,大小与学习速度成正比。如下图权值的更新方向看出它始终沿着梯度相反方向改变。
因此权值的更新方程为:
标量形式表示每个参数分量的更新分别与其对应的偏导。
例子:
假设你打算在某个城市开一所饭馆,只考虑人口对收益的影响,现在有关于人口与收益的数据,能否根据那个城市的人口预测出收益。
这里因为只考虑人口这一因素,设人口为X,收益为Y, 则Matlab的花费代码如下:
1 function J = computeCost(X, y, theta) 2 m = length(y); % number of training examples 3 J = 0; 4 H = X * theta; 5 J = 1.0 ./ (2 * m) * sum( (H - y) .^ 2); 6 End
梯度计算代码:
1 function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters) 2 %GRADIENTDESCENT Performs gradient descent to learn theta 3 % theta = GRADIENTDESENT(X, y, theta, alpha, num_iters) updates theta by 4 % taking num_iters gradient steps with learning rate alpha 5 % Initialize some useful values 6 m = length(y); % number of training examples 7 J_history = zeros(num_iters, 1); 8 for iter = 1:num_iters 9 H = X * theta; 10 theta = theta - (alpha * 1.0) / m .* (X' * (H - y)); 11 J_history(iter) = computeCost(X, y, theta); 12 end
预测结果代码:
1 % Predict values for population sizes of 35,000 and 70,000 2 predict1 = [1, 3.5] *theta; 3 fprintf('For population = 35,000, we predict a profit of %f\n',... 4 predict1*10000); 5 predict2 = [1, 7] * theta; 6 fprintf('For population = 70,000, we predict a profit of %f\n',... 7 predict2*10000);
绘制误差曲面:
1 % Grid over which we will calculate J 2 theta0_vals = linspace(-10, 10, 100); 3 theta1_vals = linspace(-1, 4, 100); 4 5 % initialize J_vals to a matrix of 0's 6 J_vals = zeros(length(theta0_vals), length(theta1_vals)); 7 8 % Fill out J_vals 9 for i = 1:length(theta0_vals) 10 for j = 1:length(theta1_vals) 11 t = [theta0_vals(i); theta1_vals(j)]; 12 J_vals(i,j) = computeCost(X, y, t); 13 end 14 end 15 % Because of the way meshgrids work in the surf command, we need to 16 % transpose J_vals before calling surf, or else the axes will be flipped 17 J_vals = J_vals'; 18 % Surface plot 19 figure; 20 surf(theta0_vals, theta1_vals, J_vals) 21 xlabel('\theta_0'); ylabel('\theta_1');
绘制等高线和最后计算的权值:
1 % Plot J_vals as 15 contours spaced logarithmically between 0.01 and 100 2 contour(theta0_vals, theta1_vals, J_vals, logspace(-2, 3, 20)) 3 xlabel('\theta_0'); ylabel('\theta_1'); 4 hold on; 5 plot(theta(1), theta(2), 'rx', 'MarkerSize', 10, 'LineWidth', 2);
原始数据和计算出来回归函数下图:
误差曲面图:
等高线图:
可见,最后权值所在全局最小值处。
对特征值归一化:
求平均值和标准差:
1 mu = mean(X); 2 sigma = std(X); 3 X_norm = [X(:,1) / sigma(1), X(:,2) / sigma(2)];
(1)