Machine Learning

Machine Learning

第一周

监督学习(supervised learning)与无监督学习(unsupervised learning)

监督学习
——需要部分数据已经明确给出 来预测一个连续的输出值(例如房价)
——回归问题(实际的数据 连续的数值 例如识别出照片上人的年龄)
——分类问题(分成少数的离散值 例如0代表良性癌症 1代表恶性癌症)

无监督学习
——聚类算法
——数据没有属性或标签这一概念 所有的数据都是一样的
——运用:网页 基因判别 分离音频 大型数据中心 社交网络分析 客户信息数据库 天文数据分析

单变量线性回归

m 样本数量
x 输入
y 输出
假设函数:hθ(x)=θ0+θ1x
代价函数:J(θ0,θ1)=1/2m
Σ(hθ(x)-y(i))²
假设函数即为:尽可能拟核所有点的函数(此时为线性函数)
代价函数即为:对应每个θ值的函数(预测值)与实际值的误差,具体表现形式为所有的差值求和再求平方乘以1/2m
目标:找出θ0和θ1使J(θ0,θ1)尽可能的小

令θ0=0
即函数为一条过原点的直线
这里给出三个点(1,1)(2,2)(3,3)
根据不同的θ1来拟核这些点
下面给出具体的操作实例以及最后求出的代价方程图像,从中可以清晰看出J最小时的θ1值


一并考虑θ0和θ1
下面主要采用轮廓图的方式
因为当θ0=0时 J的图像近似与一个弓形 所以可以推测出一并考虑两个变量时 画出的3D图形也近似于弓形
下面给出画出的3D图形以及使用轮廓图获得最小J的过程 中心点即为J最小值的点 椭圆上任意一点都对应的具体的θ0和θ1



梯度下降算法解决线性回归

何为梯度下降算法:

其中j=0/1。
α称为学习速率 表现为迫近最低点的时候的步数:每次迫近时移动多少
当α过小时 每次移动的步长太小 耗费时间
当α过大时 可能会导致不再收敛 变为发散
直观给出下图

同时我们应注意 θ0和θ1应该是同步更新的 如下图

右侧的错误示范 在更新θ1时使用了更新后的θ0值 导致算法出错

下面给出使用梯度算法是如何迫近最低点的

偏导数在最低点的右边 表现斜率为正 所以θ值减小 迫近最低点
偏导数在最低点的左边 表现效率为负 所以θ值增大 迫近最低点

当迫近最低点时 偏导数(斜率)会逐渐减少 所以步长会依次减少 使顺利迫近到最低点
所以我们无需再改变α的值 直观给出下图

下面给出利用梯度下降算法实现代价方程最小化的算法
(简单偏导数的数学运算即可得出以下结论)

再给出利用给算法实现代价方程的图解

最后梯度下降算法又称批量梯度下降算法
这是因为该算法与训练集m有关

第二周

多变量线性回归

hθ(x)=θ0+θ1x1+θ2x2+θ3x3+···+θnxn
使用内积的形式则变为下列形式:

多变量线性回归的梯度算法

根据梯度下降算法 给出给出类似的结论:


线性回归技巧:特征缩放

把某个变量进行缩放 使得范围如下:
−1 ≤ x(i) ≤ 1
or
−0.5 ≤ x(i) ≤ 0.5
就属于合格的特征缩放

有时候也会进行另一个优化操作均值归一化工作
方程如下:
xi:=xi−μi/si
μi——多变量的平均值
si——多变量的标准差(max-min)
for example:
一个房子的价格在100-2000之间 平均值为1900 那么
xi:=price−1000/1900

线性回归技巧2:学习速率的选择


若代价函数出现左上方的两种情况 说明学习速率α应适当减少
总结:
(1)若学习速率α太小 则逼近最小值的速度将会非常慢
(2)若学习速率α太大 则所呈现的函数不一定下降 最后甚至可能不收敛
所以α的合理选择可以确保梯度下降算法正确的运行

线性回归技巧3:选择合适的函数来拟核训练集

可以选择一次函数 二次函数 三次函数 或者一次函数与根号x的组合使用等等
hθ(x)=θ0+θ1x1
hθ(x)=θ0+θ1x1+θ2x21
hθ(x)=θ0+θ1x1+θ2x21+θ3x31
hθ(x)=θ0+θ1x1+θ2√x1
注意点:在这种情况下特征缩放就非常重要 例如x1的范围是1-1000 则x1²的范围和x1³的范围将会非常大

正规方程求解线性回归


正规方程是在特征项多加一项x0=1 把所有的特征项看作矩阵X 把样本输出看作向量Y 则满足:
θ=(XTX)−1XTy
下面给出梯度下降算法和正规方程的优缺点比较:

总结如下:
梯度下降算法:需要选择α值 需要迭代 复杂度较正规方程较低 当特征非常大时性能较高
正规方程:无需选择α值 不需要迭代 复杂度较高 一般在n≤10000时使用 并且在此算法中无需使用特征缩放

正规方程注意点

在Octave中我们更希望使用pinv而非inv 因为pinv在XXT不可逆时也能求出Θ值
若XXT不可逆 可能有以下原因:
(1)有多余的特征 当两个或多个特征相似时可以删去重复的特征
(2)特征过多(n≥m) 可使用正则化(后面会提到)

matlab基础知识

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
~= 不等于
disp 输出
disp(sprintf('2 decimals: %0.2f',a))
format long 小数点后输出多位
format short 正常输出
v=1:0.1:2 表示输出以1为首项0.1为公差到2的所有数据
v=1:6 输出1~6
ones(x,y) 矩阵元素均为1
zeros(x,y) 矩阵元素均为0
eye(x) 产生x行x列的单位阵
rand(x,y) 产生x行y列的随机数
randn(x,y) 产生x行y列的高斯分布(正态分布)
hist(w) 打印出w的直方图
hist(w,50) 直方图分成50份
quix exit 退出matlab
//////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
size(A) 返回矩阵A的行数和列数
size(A,1) 返回矩阵A的行数
size(A,2) 返回矩阵A的列数
length(A) 返回矩阵A行列数的最大值
pwd matlab的原路径
cd 'D:\matlab\data' 修改路径
load name.dat 读取name.dat文件
load name.txt 读取name.txt文件
who 显示工作环境变量
whos 进一步详细显示工作变量
clear name 输出name文件
save new_name.mat v 把v中存储的数据保存在new_name文件中 存入data文件中
clear 清除所有变量
A(3,2) 读取矩阵A的三行二列元素
: 表示取出这一行或这一列的所有元素
A(2,:) 读取矩阵A第二行的所有元素
A(:,2) 读取矩阵A第二列的所有元素
A([1,3],:) 读取矩阵A第一行和第二行的所有元素
A(,:2)=[10;11;12] 给矩阵第二列的所有元素重新赋值
A=[A,[10;11;12]] 在矩阵A的右边加入新的一列元素
A(:) 把矩阵A的所有元素并为一列
C=[A B] 把矩阵A放左边 矩阵B放右边
C=[A,B] 与上述表达式效果相同
C=[A;B] 把矩阵A放上面 矩阵B放下面
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
A*B 矩阵A和矩阵B相乘
A .* B 矩阵A和矩阵B对应元素相乘
A .^ 2 矩阵A对应元素平方
1 ./ v 矩阵v的对应元素球倒数
log(v) 矩阵v的对应元素取对数
exp(v) 矩阵v的对应元素取e次幂
abs(v) 矩阵v的对应元素取绝对值
-v 矩阵v的对应元素取反
v+1 矩阵v的对应元素+1
A' 矩阵A的转置
(A')' 矩阵A的转置的转置 等于A
max(a) 求出矩阵a对应每一列的最大值 若只有一行那就是这一行的最大值
[val,ind]=max(a) val等于矩阵最大值 ind等于最大值的索引
a<3 矩阵a的每个元素会和3比较 若满足返回1 不满足返回0
find(a<3) 返回a中小于3的索引
magic(n) 输出n阶矩阵 它的每行每列对角线和都相等
[r,c]=find(A>=7) r和c对应起来是存放A中每个大于等于7的元素的行和列
prod(a) 对a中的每个元素求积
floor(a) a中的每个元素下取整
ceil(a) a中的每个元素上取整
max(rand(3),rand(3)) 返回两个3*3的矩阵并且对应位置取出最大值 变为一个矩阵
max(A,[],1) 求出A的每一列的最大值(不要[]也可)
max(A,[],2) 求出A的每一行的最大值(不要[]也可)
max(A) 默认是每一列的最大值
max(A[:]) A中所有元素并为一列求最大值 实际求出矩阵A的最大值
max(max(A)) 求出矩阵A的最大值
sum(sum(A .* eye(n))) 求出矩阵A主对角线的和
sum(sum(A .* flipud(eye(n)))) 求出矩阵A副对角线的和
flipud 表示矩阵上下翻转
flipud(eye(n)) 副对角线上元素全为1
pinv(A) 求矩阵A的逆阵
A*pinv(A) 矩阵A*矩阵A的逆阵 等于E
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
t=[0:0.01:0.98] 表示t为0到0.98公差为0.01的所有元素
y1=sin(2*pi*4*t)
plot(t,y1) 画出y1的图像
y2=cos(2*pi*4*t)
plot(t,y2) 画出y2的图线
holo on 表示第二个图像会画在第一个图像之上
plot(t,y2,'r') 表示第二个图像会以红色叠在第一个图像之上
xlabel('time') 横坐标表示time
ylabel('value') 纵坐标表示value
ledend('sin','cos') 图像会显示两种图像的图例
title('my plot') 图像的名字叫my plot
print -dpng 'my_plot.png' 保存叫my_plot.png的图像
close 关闭图像
figue(1);plot(t,y1); 表示画出编号为1的图像
figue(2);plot(t,y2); 表示画出编号为2的图像 两个图像在两个窗口
subplot(1,2,1) 图像分成左右两部分 1显示在左边
plot(t,y1) 会在左边画出y1的图像
subplot(1,2,2) 右边也会显示出对应图像框
plot(t,y2) 会在右边画出y2的图像
axis([0.5 1 -1 1]) 图像的横坐标改为0.5到1 纵坐标改为-1到1
clf 清空图像
imagesc(magic(n)) 会为魔术阵A画出一个彩色格
imagesc(A),colorbar,colormap grey
图像表内灰白色 并且会显示颜色条
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
for i:10,
v(i)=2^i;
end; v会打印出2到1-10次放的数字
////////////////////////////////////////////////////////////////////////
i=1;
while i<=5,
v(i)=100;
i=i+1;
end; v的前五个元素置为100
////////////////////////////////////////////////////////////////////////
i=1;
while true,
v(i)=999;
i=i+1;
if i==6,
break;
end;
end; v的前五个元素置为999
////////////////////////////////////////////////////////////////////////
v(1)=2;
if v(1)==1,
disp('the value is one');
elseif v(1)==2
disp('the value is two');
else
disp('the value is not one or two');
end; 输出the value is two
////////////////////////////////////////////////////////////////////////
新建脚本后可以写入函数 并保存到data中 之后可以直接调用函数
matlab的函数可以返回多个数值 例如:
function[y1,y2]=squareandcubethisnumber(x)
y1=x^2;
y2=x^3;
costfunctionJ的例子需掌握
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
文章目录
  1. 1. Machine Learning
    1. 1.1. 第一周
      1. 1.1.1. 监督学习(supervised learning)与无监督学习(unsupervised learning)
      2. 1.1.2. 单变量线性回归
      3. 1.1.3. 梯度下降算法解决线性回归
    2. 1.2. 第二周
      1. 1.2.1. 多变量线性回归
      2. 1.2.2. 多变量线性回归的梯度算法
      3. 1.2.3. 线性回归技巧:特征缩放
      4. 1.2.4. 线性回归技巧2:学习速率的选择
      5. 1.2.5. 线性回归技巧3:选择合适的函数来拟核训练集
      6. 1.2.6. 正规方程求解线性回归
      7. 1.2.7. 正规方程注意点
    3. 1.3. matlab基础知识
|