Coursera Machine Learning Class by Andrew Ng - Week 2 - Notes

一直在默默撸机器学习的课程,但之前经常被打断,没有完课,很可惜。这一轮课程,要坚持下来~:D

Week 1 主要是讲比较基础的东西,聚类/分类的定义、线性回归的基本知识等等。暂时不把纸质笔记整理上来,后续进行整理。

Week 2 开始,Andrew带我们作了Octave实训,留了编程作业,课程从单变量线性回归升级到多变量,难度也有所增加。以下是部分笔记。

【一】Octave常用命令

(1)Basic operation

  • 真值判断:等于不等于,或且非运算,结果是1 或者 0(例如1==2,true == false,true != false,true | false,true & false,~true)
  • a = [1:0.2:2] :以0.2为步长,1到2的一维数组([起始;步长;结尾])
  • Rand(3) : 1x3 随机数字数组
  • Randn(2,3): 2x3 随机正态分布数组
  • hist() :直方图
  • ones(4) :1x4全一数组
  • zeros(3,4): 3x4 全零数组
  • eye(5): 5x5单位矩阵
  • help eye:获取eye函数的帮助文档
  • addpath('C:\XXX\XXAAA\AAA'); 可以把路径加入octave的搜索路径中

(2)Moving Data Around

  • A=[1,2,3;4,5,6] :生成一个2x3的矩阵
  • size(A) :获得[2,3],分别是A的行数和列数
  • size(A,1): 结果是2,返回A的行数
  • length(A): 结果是A的较大的维度的数值,这里结果为3
  • 路径:pwd 打印当前路径;cd ‘C:\USER\XXX\’ 修改当前路径
  • ls 列出当前路径下的文件列表
  • load('featureX.dat') 可以用来加载文件中的数据(格式规范的数据,行列)
  • who 输出在工作台上之前定义过的变量;whos可以列出更为详细的信息
  • v = featureX(1:10) 将v赋值为featureX的前10个元素组成的数组
  • save hello.mat v   可以把v的数值存储到hello.mat中,这里连变量名字也一起存储了,二进制格式
  • clear 可以清掉工作台上所有的变量
  • load hello.mat 可以把变量v恢复回来
  • save hello.txt v -ascii 将v的数值以文本方式存储
  • A(2,3) 可以得到第二行第三列的A的元素
  • A(2,:) 可以获得第二行的所有元素
  • A([1 3], :) 可以获得第一行和第三行的所有数据
  • A(:,2) = [1;2;3] 可以修改A的元素内容
  • A = [A, [1;2;3]] 相当于在A的右边增加一列
  • A(:) 获得把所有列,排列成为一列的输出
  • C = [A B] 把A,B并排做成一个矩阵
  • C = [A;B] 把B补充为A新的行

(3)Computing on Data

  • C = A.*B  点乘表示对应位置的数字相乘
  • C = A*B  矩阵相乘
  • A = B.^2 每个元素平方组成新的矩阵
  • B^2 就变成两个B相乘了(不是点乘!)
  • C = 1./ A 倒数(每个元素)
  • log(A) log操作(每个元素)
  • exp(A) 返回自然常数e的A指数矩阵
  • abs(A) A绝对值矩阵(每个元素)
  • -1 * A  给A的每个元素乘以一个倍数
  • A + ones(length(A), size(A,2)), 可以给A的每个元素增加一个1
  • A + 1 每个元素增加1
  • A'   表示A的转置,这里的符号是左单引号
  • max(A)  返回A中最大元素
  • [val,ind] = max(A) 也是返回A中的最大元素;val是最大值,ind是最大值的index
  • A<3 这里的比较操作也是每个元素单独进行的
  • find(A<3) :结果会返回A中小于3的所有元素的index 
  • A = magic(3),  会生成一个3x3的矩阵,每一行每一列加的结果相等(画出的矩阵visualization后可以看到对称的pattern)
  • [r,c] = find(A < 3) : r是所有满足结果的行号,c是相应的列号
  • sum(A) 返回A的所有元素的和
  • prod(A) 返回素有A的元素的积
  • floor(A), ceil(A) 返回A中所有元素的round之后的值
  • max(A,[],1) 返回A的每列的最大值
  • max(A,[],2) 返回A的每行的最大值
  • max(A)  是每列的最大值(A = [1 2; 2 1], 结果是2 2)
  • max(max(A)) 可以求得全局最大值
  • max(A(:)) 也可以可以求得全局最大值
  • sum(A) 返回每列的和
  • sum(A, 1) 返回每列的和
  • sum(A, 2) 每行和
  • 计算A的对角线的和:设B = A.* eye(2); 则sum(sum(B)) 就是A的对角线的元素的和
  • flipud(A) 可以把A的元素翻转,指的是每列的内容都进行翻转
  • pinv(A) 计算A的逆 

(4) Plotting Data

  • 设x = [0:0.01:0.98],y = sin(2*pi*4*x)。用plot(x,y)  可以画出以0.01为步长的正弦曲线来
  • hold on 可以继续在之前的图上继续画新的图像,叠加。
  • plot(x,y2,'r') 可以在上一个正弦曲线的基础上画出一条红色的余弦曲线。“‘r’”=red
  • 设置横纵坐标轴的名称:xlabel(‘time’)、ylabel('value') 
  • legend('sin', 'cos') 图例(画在侧面)
  • title('my figure') 图标标题(画在顶部正中)
  • print -dpng 'my.png'   将图片输出这之前可以修改cd路径
  • figure:画布。在不同的图上面画不同的曲线:figure(1); plot(x,y);figure(2); plot(x,y2) 这样就会有两个图,同时输出。
  • subplot:在一张画布中分别绘出两个图。subplot(1,2,1); plot(x,y); subplot(1,2,2); plot(x,y2); 这样两个曲线在同一个frame里面,这个frame分成了1x2的部分,y=f(x)在其中的第一个部分,另一个在第二部分
  • axis([0.5 1 -1 1]) 这样可以设置图像横纵坐标的取值范围,现在横纵坐标分别为[0.5 1] 和[-1 1]
  • clf; clear figure
  • A=magic(5),imagesc(A)把矩阵A画成彩色小方格。imagesc(A), colorbar, colormap gray绘制出灰色的格子图,带右侧的colorbar(颜色条)
    * magesc Scale data and display as image.
    colorbar 显示颜色渐变条,表明颜色含义
    colormap 设置colormap性质  即RGB三色

(5) 控制语句

  • for loop:

  v = zeros(10)

  for i=1:10,

      v(i) = 2^i;

  end;

 

  indices = 1:10

  for i=indices,

      disp(i);

  end;

 

  • while:

  i = 0;

  while i<5,

      v(i)=100;

      i = i+1;

  end;

 

  i = 0;

  while i<10,

      v(i)=100;

      i = i+1;

      if i == 6,

            break;

      end;

  end;

 

  • if else 

  if i==1,

      disp(i);

  elseif i==2,

      disp(i);

  else

      disp(i);

  end;

 

  • 函数Function:新建一个m文件,在其中定义函数:

  单变量的函数:

    function y = sqareThisNum(x)

    y = x^2;

    保存为squareThisNum.m后,调用该文件,即可以调用函数sqareThis Num()了

  多变量的函数:

    function [y1,y2] = my_func(x)

    y1 = x^2;

    y2 = x^3;

     调用方法:[a,b] = my_func(5); 

 

(6)Vectorrization

很多问题通过向量化可以很快速地解决。例如关于线性回归的假设,若不用向量化,可写为for循环:

prediction = 0.0

for j=1:n+1

  prediction = prediction+theta(j)*x(j)

end;

若用,则可以写为一句话:

prediction=theta' * x(theta'即theta的转置矩阵)

(或以C++来表述:double prediction = theta.transpose()*x )

另,Octave的index是从1开始的

 

posted @ 2014-10-22 15:06  Urania  阅读(350)  评论(0编辑  收藏  举报