1.机器学习定义
机器学习是一种已经超出了AI或者人工智能能领域的领域。
我们已经在自动直升机上工作了很多年,我们只是不知道该怎么写使这架直升机自行飞行的计算机程序。唯一有效的是有一台计算机自己学习如何驾驶这架直升机。
Samuel 定义:机器学习是使计算机无需显示学习就可以学习。
Tom Mitchell 新定义:一个计算机程序可以从经验E中学习以下方面的知识: 一些任务T和一些绩效指标P,如果它在T上的绩效,
由P衡量,随着经验E的提高。
主要的学习算法有:监督学习(supervised learning)和无监督学习,监督学习就是教计算机如何做某事,指我们为算法提供了一个数据集,其中, 被称为“正确答案”。 也就是说,我们为它提供了一个房屋价格数据集,其中于该数据集中的每个示例, 我们告诉它什么是合适的价格。
无监督学习就是让计算机自己学习。
无监督学习使我们几乎或根本不了解结果应该是神魔样的情况下解决问题。我们可以从数据中获得结构,而不必知道变量的影响。如:鸡尾酒算法:在混乱的环境中找到结构以及聚类算法
1.1第一个学习算法 单个参数回归
理论:
回归算法,属于监督学习
在监督学习中,我们有一个数据集,这个数据集称为 训练集,使用小写字母m表示培训示例的数量,小写字母x表示输入变量,y表示我要输出的输出变量或目标变量预测,使用(x,y)表示单个训练示例。(x(i),y(i))仅引用此表的第i行。
学习算法的工作是输出一个按照惯例通常表示为小写h和h的函数 代表假设。
当我们试图预测的目标变量是连续的时,例如在我们的住房示例中,我们将学习问题称为回归问题。当y只能采用少量离散值时(例如,如果给定居住面积,我们想预测某个住宅是房子还是公寓),我们称其为分类问题
简化假设:
单个参数时是抛物线,如果是两个参数的话,成本函数就是一个3-D表面图
将其变为等高线图:每一个椭圆的成本函数值相同。
我们要做的就是让电脑通过算法自动查找成本函数最小的 theta零和theta1的值。
提出
梯度下降算法:Gradient decent algorithm
我们将知道,当成本函数位于图中凹坑的最底部时,即当其值最小时,我们就成功了。红色箭头显示图中的最小点。
我们这样做的方法是采用成本函数的导数(函数的切线)。切线的斜率是该点的导数,它将为我们提供一个方向。我们沿下降最陡的方向逐步降低成本函数。每个步骤的大小由参数α(称为学习率)确定。
例如,上图中每个“星”之间的距离代表由我们的参数α确定的步长。较小的α将导致较小的步长,较大的α将导致较大的步长。步骤的执行方向由的偏导数确定 ȷ ^ ( θ 0 , θ 1 ) \hat{\jmath}\left(\theta_{0}, \theta_{1}\right) ȷ^(θ0,θ1) 。
同时取决于一个人在图上开始的位置,一个人可能会在不同的点结束。上图为我们显示了两个不同的起点,它们以两个不同的位置结束。
梯度下降算法为:
θ
j
:
=
θ
j
−
α
∂
∂
θ
j
J
(
θ
0
,
θ
1
)
\theta_{j}:=\theta_{j}-\alpha \frac{\partial}{\partial \theta_{j}} J\left(\theta_{0}, \theta_{1}\right)
θj:=θj−α∂θj∂J(θ0,θ1)
重复直到收敛。
每次迭代都要更新参数:
如果Alpha值太小,我又迈出了一步。 所以,如果我的学习率太小,我最终会失败的 当尝试将这些最小的步骤最小化时,采取这些微小的步骤。 我将需要很多步骤才能达到最低限度,所以 如果Alpha值太小,梯度下降会很慢,因为它会采取这些微小的步骤,它需要很多步骤才能达到接近最低要求的水平。
如果我们的alpha太大 则梯度下降可能会超出最小值,甚至可能无法转换或甚至转移。
如果初始参数是局部最优,导数将等于零。更新了这个theta一减去alpha乘以零。 因此,这意味着如果您已经处于局部最优状态,它将离开 theta 1不变会导致其更新,因为theta 1等于theta 1。 因此,如果参数已经是本地最小值 梯度下降的步骤绝对不会做任何事,这不是想要的。
所有这些的要点是,如果我们从对假设的猜测开始,然后重复应用这些梯度下降方程,则我们的假设将变得越来越准确。
2.多个参数时多项式回归
我们可以通过将每个输入值都设置在大致相同的范围内来加快梯度下降的速度。这是因为θ在小范围内会迅速下降,而在大范围内会缓慢下降,因此当变量非常不均匀时,会无效率地振荡到最佳状态。
防止这种情况的方法是修改输入变量的范围,以使它们都大致相同。理想情况下:
−
1
≤
x
(
i
)
≤
1
-1 \leq x(i) \leq 1
−1≤x(i)≤1
−
0.5
≤
x
(
i
)
≤
0.5
-0.5 \leq x_{(i)} \leq 0.5
−0.5≤x(i)≤0.5
这些不是确切的要求;我们只是试图加快速度。目标是使所有输入变量大致进入这些范围之一,给出或取几个。
有助于此的两种技术是特征缩放和均值归一化。特征缩放涉及将输入值除以输入变量的范围(即最大值减去最小值),从而得到的新范围仅为1。平均归一化涉及从输入值的平均值中减去输入变量的平均值。输入变量导致输入变量的新平均值仅为零。要实现这两种技术,请按照以下公式调整输入值:
x
i
:
=
x
i
−
μ
i
s
i
x_{i}:=\frac{x_{i}-\mu_{i}}{s_{i}}
xi:=sixi−μi
例如,代表房价范围为100至2000,平均值为1000,那么,
x
i
:
=
price
−
1000
1900
.
x_{i}:=\frac{\text { price }-1000}{1900} \text { . }
xi:=1900 price −1000 .
*
3.正态方程
梯度下降提供了一种最小化J的方法。让我们讨论这样做的第二种方法,这一次显式地执行最小化,而不求助于迭代算法。在“正态方程”方法中,我们将通过明确地针对θj取导数并将其设置为零来最小化J。这使我们无需迭代即可找到最佳theta。正态方程公式如下:
θ
=
(
X
⊤
˘
X
)
−
1
X
⊤
¨
y
¨
\theta=\left(X^{\breve{\top}} X\right)^{-1} X^{\ddot{\top}} \ddot{y}
θ=(X⊤˘X)−1X⊤¨y¨
以下是梯度下降与正太方程方程的比较:
利用正态方程,计算反演具有复杂性。因此,如果我们具有大量特征,则正常方程将变慢。实际上,当n超过10,000时,可能是从正常解转到迭代过程的好时机。
程序
单特征:
warmUpExercise.m
。
function A = warmUpExercise()
function that returns the 5x5 identity matrix
A = [1 0 0 0 0;
0 1 0 0 0;
0 0 1 0 0;
0 0 0 1 0;
0 0 0 0 1;];
end
computeCost.m
function J = computeCost(X, y, theta)
m = length(y);
J = 0;
for i=1:m
h=theta(1)+theta(2)*X(i,2);
J=J+power(h-y(i,1),2);
end
J=J/(2*m);
end
gradientDescent.m
。
function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters)
m = length(y); % number of training examples
J_history = zeros(num_iters, 1);
for iter = 1:num_iters
H = X * theta;
Sum = zeros(2, 1);
for j = 1:2
for i = 1 : m
Sum(j,1) = Sum(j,1) + (H(i) - y(i)) * X(i,j)';
end
theta = theta - (alpha * Sum) / m;
end
% Save the cost J in every iteration
J_history(iter) = computeCost(X, y, theta);
end
end
测试主函数:
main.m
。
clear
clc
data = load('ex1data1.txt'); % read comma separated data
x = data(:, 1); y = data(:, 2);
plotData(x,y);
m = length(x); % number of training examples
X = [ones(m,1),data(:,1)]; % Add a column of ones to x
theta = zeros(2, 1); % initialize fitting parameters
iterations = 1500;
alpha = 0.01;
[theta, J_history]= gradientDescent(X, y, theta, alpha, iterations);
fprintf('Theta computed from gradient descent:\n%f,\n%f',theta(1),theta(2))
% 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);
提交:
多特征:
computeCostMulti.m
。
function J = computeCostMulti(X, y, theta)
J = 0;
for i=1:m
h=0;
for k=1:length(theta)
h=h+theta(k)*X(i,k);
end
J=J+power(h-y(i,1),2);
end
J=J/(2*m);
end
gradientDescentMulti.m
。
function [theta, J_history,theta_history] = gradientDescentMulti(X, y, theta, alpha, num_iters)
m = length(y); % number of training examples
J_history = zeros(num_iters, 1);
theta_history= zeros(num_iters, 3);
for iter = 1:num_iters
H = X * theta;
Sum = zeros(2, 1);
for j = 1:3
for i = 1 : m
Sum(j,1) = Sum(j,1) + (H(i) - y(i)) * X(i,j)';
end
theta = theta - (alpha * Sum) / m;
end
% Save the cost J in every iteration
J_history(iter) = computeCostMulti(X, y, theta);
end
end
正则方程较简单,在多变量的基础上将theta 换成:
theta=inv(X'*X)*X'*y;
总结
下图来源于:博主:Gao_HongXiang