吴恩达机器学习笔记
文章目录
基础概览
当前分类
- 监督学习 supervised
- 回归 regression
- 分类 classification
- 非监督学习unsupervised
- cluster
- 强化学习 reinforcement
- recommender systems
基本模型
- 假设函数
- 欲求参数
- 代价函数:常用的这个叫 square error cost function
- 目标:通过逐步确定参数,使得代价最小
=================================================
怎么确定参数呢?
确定参数方法1 梯度下降法
gradient descent : 适合大多数情况
- alpha 是 学习率,就是逐步靠近代价函数最小值时,那个”逐步“的步子长度。
- 注意两种编程 求参数的方法,右边那个是错的。
确定参数方法2 正规方程法
normal equation
既然是求代价函数的最小值,求导为0就好啊!
- 中间要求矩阵的逆,不适合特征值太多的情况,一般大于10000特征值,就不能用这个。
- 不需要特征放缩之类的。
推导过程省略,最优参数求解方程如下
多元线性回归
线性回归 = 平方差代价函数 + 梯度下降
多元线性回归的模型
先看我 : 一些技巧
feature scaling 特征放缩
x1 = size 范围是0-2000
x2 = num 范围是0-5
这种情况下画的图是 瘦长 的,回归可能很慢
可以这样处理
x1 = x1/2000
x2 = x2/5
mean normalization 均值归一
x1 = size 范围是0-2000
x2 = num 范围是0-5
减去均值,再除以总数
x1 = (x1 - mean(x1))/2000
x2 = (x2 - mean(x2))/5
然后再处理
确保学习率alpha
- 太大,就会震荡,甚至发散
- 太小,收敛速度太慢
octave操作
系统命令
代码 | 功能 |
---|---|
ps1(‘>> ’) | 更改命令行提示符 |
disp() | disp(pi) :显示一个东西 |
format long/short | 定义全局显示方式,默认是short |
pwd | 当前所在目录 |
cd | 切换目录 |
ls | 看看当前目录有啥 |
who | 当前内存中的变量 |
whos | 查看内存中变量的详细信息 |
clear | 清空内存中所有变量 |
load | load aa.txt , aa = load(‘aa.txt’),加载文件 |
save | save xxx.mat V :把矩阵V保存到xxx.mat,使用二进制格式。 |
save | save xxx.txt V --ascii :把矩阵V保存到xxx.txt,人类可直接阅读 |
addpath(‘c:\users’) | 添加搜索路径 |
运算符
代码 | 功能 |
---|---|
+ - * / | 四则运算 |
^ | 2^4 == 16 |
== | 判断是否相等 |
~= | 判断是否不等 |
&& || | 与 或 |
xor() | 异或 |
矩阵命令
代码 | 功能 |
---|---|
ones(2,3) | 2x3 的矩阵, 全是1 |
zeros(2,3) | 2x3 的矩阵, 全是0 |
rand(2,3) | 2x3 的矩阵, 0-1之间的随机数 |
randn(2,3) | 2x3 的矩阵, 0-1之间正态分布的随机数 |
size() | 查看 行x列 |
size(A,1) | 查看第一维度,也就是行数 |
size(A,2) | 查看第二维度,也就是列数 |
length([向量V]) | 长度 |
magic(8) | 生成一个8x8的魔幻方阵,魔幻方阵的行列对角之和 均相等。 |
* | A*B表示 矩阵乘法 |
.* | .表示对应的每个元素,A.*B表示 对应元素相乘 |
A,^2 | 矩阵每个元素都都平方 |
1./A | 矩阵每个元素都倒数 |
log() | 求log |
exp(n) | 求e^n |
abs() | 绝对值 |
A’ | 求转置 |
pinv(A) | 求逆 |
max(A) | 每列的最大值,和max(A,[],1) 效果一样 |
max(A,[],2) | 每行的最大值 |
sum() | sum(A,1)表示按列求和,sum(A,2)表示按行求和,默认按列 |
prod() | prod(A,1)表示按列求积,prod(A,2)表示按行求积,默认按列 |
floor() | 向上取整 |
ceil() | 向下取整 |
[r,c] = find(A>=5);[r,c] | [r,c]会返回每个查找出来的元素的索引 |
flipud() | 矩阵垂直翻转 |
for example:
求对角线之和:sum(sum(A.*eye(5)))
求副对角线之和:sum(sum(flipud(eye(5))))
绘图函数
代码 | 功能 |
---|---|
plot(x,y) | 绘制曲线 |
hist(object,hist_num) | hist(randn(1,1000),100) : 用一百个hist绘图正态分布 |
subplot(1,2,1) | 创建1x2的图像,使用第一个 |
figure(n) | 画出一张图,编号为n |
imagesc(V);colorbar;colormap grey; | 方块灰度图像 |
title | 设置标题 |
xlabel(‘xx’) | 设置x轴文字 |
ylabel(‘yy’) | 设置Y轴文字 |
legend(‘tips’) | 给每个图形打上标签 |
axis([0 1 -1 1]) | 制定x轴范围是(0,1),y轴的范围是(-1,1) |
print -dpng ‘mytest.png’ | 在当前目录生成图像 |
close | 关闭所有图像 |
for example:
常常把一些列操作放在一行,直接处理好一张图片
逗号和分好都能用。分号会屏蔽即时显示。
plot(xxxx);hold on;plot(yyyy); %把两张图绘到一起
figure(1),plot(x,y),legend('hello')
玩耍矩阵
移动数据
# 矩阵基本操作
行内用 空格或者逗号 隔开,行间用;隔开
A = [1 2 ; 3 6 ; 87 14]
取出第二列
A = [:,2]
第三行第一个
A(3)
第三行
A(3,:)
第一行 和 第三行
A([1,3],:)
修改第二列
A(:,2) = [10,11,12]
加行
A = [A;[3,4]]
加列
A = [A,[12,54,6]]
合并两个矩阵
C = [A,B]
C = [A;B]
控制语句(if for while 函数)
if for while
for i=1:10; disp(i); end;
if V(1)==1; xxx;
elseif v(2)==2; xxxx;
else xxxx;
end;
while true; xxxx; end;
函数
octave函数得写到文件里面
比如想要一个名为 two_test() 的函数,
-
建立一个文件,名为 two_test.m
-
写入如下
function [y1,y2] = two_test(x); y1 = x^2 y2 = x^3
-
addpath 或者 cd到函数文件的目录 ,直接使用函数。