[关闭]
@FE40536 2019-08-04T03:31:47.000000Z 字数 4891 阅读 767

吴恩达机器学习005Octave使用

octave 算法 机器学习


基本使用

基本加减乘除


  1. >> 5+5
  2. ans = 10
  3. >> 5-5
  4. ans = 0
  5. >> 5*5
  6. ans = 25
  7. >> 5/5
  8. ans = 1

判断


  1. >> 5==5
  2. ans = 1
  3. >> 5~=5
  4. ans = 0


逻辑

  1. >> 1&&0
  2. ans = 0
  3. >> 1||0
  4. ans = 1
  5. >> xor(5,5)
  6. ans = 0

输出

  1. >> sprintf("%d",5)
  2. ans = 5
  3. >> disp(5)
  4. 5

矩阵&向量


  1. >> v=[1 2 3]
  2. v =
  3. 1 2 3
  4. >> v=[1 ;2; 3]
  5. v =
  6. 1
  7. 2
  8. 3


  1. >> A=1:0.5:5
  2. A =
  3. 1.0000 1.5000 2.0000 2.5000 3.0000 3.5000 4.0000 4.5000 5.0000
  4. >> A=1:5
  5. A =
  6. 1 2 3 4 5


  1. >> ones(2)
  2. ans =
  3. 1 1
  4. 1 1
  5. >> ones(1,2)
  6. ans =
  7. 1 1
  8. >> rand(1,3)
  9. ans =
  10. 0.17587 0.79121 0.19460
  11. >> randn(1,3)
  12. ans =
  13. 1.00501 0.45054 -1.36525


  1. >> w=-10+sqrt(10)*randn(1,10000);
  2. >> hist(w)
  3. >> hist(w,50)

pic1

移动数据

size&length


  1. >> size(A)
  2. ans =
  3. 3 2
  4. >> size(A,1)
  5. ans = 3
  6. >> size(A,2)
  7. ans = 2
  8. >> length(v)
  9. ans = 5

基础指令


  1. >> load(test.dat)
  2. >> load test.dat
  3. >> ls
  4. >> cd ..
  5. >> pwd
  6. >> who
  7. >> clear test
  8. Variables in the current scope:
  9. A ans test v y
  10. >> whos
  11. Variables in the current scope:
  12. Attr Name Size Bytes Class
  13. ==== ==== ==== ===== =====
  14. A 3x2 48 double
  15. ans 75x1 600 double
  16. test 75x2 1200 double
  17. v 1x5 40 double
  18. y 75x1 600 double
  19. Total is 311 elements using 2488 bytes

存储变量

矩阵操作

  1. >> A(:,2)
  2. ans =
  3. 2
  4. 4
  5. 6
  6. >> A(2,:)
  7. ans =
  8. 3 4
  9. >> A(2,1)
  10. ans = 3
  11. >> A(3,2)
  12. ans = 6
  13. >> A([1,3],:)
  14. ans =
  15. 1 2
  16. 5 6
  17. >> A(:,2)=[10,11,12]
  18. A =
  19. 1 10
  20. 3 11
  21. 5 12
  22. >> A(:)
  23. ans =
  24. 1
  25. 3
  26. 5
  27. 2
  28. 4
  29. 6
  30. 10
  31. 11
  32. 12
  33. >> A=[A,[10;11;12]]
  34. A =
  35. 1 2 10
  36. 3 4 11
  37. 5 6 12
  38. >> C=[A B]
  39. C =
  40. 1 2 1 2
  41. 3 4 3 4
  42. 5 6 5 6


计算数据

矩阵运算

  1. >> A=[1 2;3 4;5 6];
  2. >> B=[11 12;13 14;15 16];
  3. >> C=[1 1;2 2];
  4. >> A*C
  5. ans =
  6. 5 5
  7. 11 11
  8. 17 17
  9. >> A.*B
  10. ans =
  11. 11 24
  12. 39 56
  13. 75 96
  14. >> A.^2
  15. ans =
  16. 1 4
  17. 9 16
  18. 25 36
  19. >> 1 ./ A
  20. ans =
  21. 1.00000 0.50000
  22. 0.33333 0.25000
  23. 0.20000 0.16667
  24. >> log(A)
  25. ans =
  26. 0.00000 0.69315
  27. 1.09861 1.38629
  28. 1.60944 1.79176
  29. >> exp(A)
  30. ans =
  31. 2.7183 7.3891
  32. 20.0855 54.5982
  33. 148.4132 403.4288
  34. >> A'
  35. ans =
  36. 1 3 5
  37. 2 4 6


向量运算


  1. >> v=[1;2;3]
  2. >> v+ones(length(v),1)
  3. ans =
  4. 2
  5. 3
  6. 4
  7. >> 1 ./ v
  8. ans =
  9. 1.00000
  10. 0.50000
  11. 0.33333

其他操作

  1. >> a=[1 15 2 0.5];
  2. ̗>> [val int]=max(a)
  3. val = 15
  4. int = 2
  5. >> find(a<3)
  6. ans =
  7. 1 3 4
  8. >> a<3
  9. ans =
  10. 1 0 1 1
  11. >> [row col]=find(A>=3)
  12. row =
  13. 2
  14. 3
  15. 2
  16. 3
  17. col =
  18. 1
  19. 1
  20. 2
  21. 2
  22. >> sum(a)
  23. ans = 18.500
  24. >> prod(a)
  25. ans = 15
  26. >> floor(a)
  27. ans =
  28. 1 2 15 0
  29. >> ceil(a)
  30. ans =
  31. 1 2 15 1
  32. >> max(A,[],1)
  33. ans =
  34. 8 9 7
  35. >> max(A,[],2)
  36. ans =
  37. 8
  38. 7
  39. 9
  40. > max(A(:))
  41. ans = 9
  42. >> sum(A,1)
  43. ans =
  44. 15 15 15
  45. >> sum(A,2)
  46. ans =
  47. 15
  48. 15
  49. 15
  50. >> B=eye(3)
  51. B =
  52. Diagonal Matrix
  53. 1 0 0
  54. 0 1 0
  55. 0 0 1
  56. >> C=A.*B
  57. C =
  58. 8 0 0
  59. 0 5 0
  60. 0 0 2
  61. >> sum(C(:))
  62. ans = 15




数据绘制

  1. >> t=0.1:0.01:0.98;
  2. >> y1=sin(2*pi*4*t);
  3. >> plot(t,y1);

pic2

  1. >> y2=cos(2*pi*4*t);
  2. >> plot(t,y2)

pic3

  1. %继续绘图
  2. >> hold on;
  3. >> plot(t,y1,'r')

pic4


  1. %添加坐标轴名称
  2. >> xlabel('time')
  3. >> ylabel('value')

pic5

  1. %显示函数图例和标题
  2. >> legend('cos','sin')

pic6

  1. %保存图片 关闭图片 绘制多图
  2. >> print -dpng 'myplot.jpg'
  3. >> close
  4. >> figure(1);plot(t,y1);
  5. >> figure(2);plot(t,y2);
  6. %分隔绘图 加改变轴尺度
  7. >> subplot(1,2,1); %将图像分成1*2的格子,使用第一个
  8. >> subplot(1, 2 ,1)
  9. >> plot(t,y1)
  10. >> subplot(1, 2 ,2)
  11. >> plot(t,y2)
  12. >> axis([0.5 1 -1 1])
  13. %清楚图像
  14. >> clf

pic7

  1. %矩阵可视化
  2. >> A=magic(5)
  3. >> imagesc(A)

pic8

  1. %其他操作
  2. > imagesc(magic(15)),colorbar,colormap gray

pic9


控制语句:if for while

for语句

  1. >> v=zeros(10,1)
  2. >> for i=1:10,
  3. v(i)=i^2;
  4. end;
  5. >> v
  6. v =
  7. 1
  8. 4
  9. 9
  10. 16
  11. 25
  12. 36
  13. 49
  14. 64
  15. 81
  16. 100
  17. % 另一种方式
  18. >> indices=1:10
  19. indices =
  20. 1 2 3 4 5 6 7 8 9 10
  21. >> for i=indices ,
  22. v(i)=i^2;
  23. end;
  24. >> v
  25. v =
  26. 1
  27. 4
  28. 9
  29. 16
  30. 25
  31. 36
  32. 49
  33. 64
  34. 81
  35. 100




while语句

  1. >> i=1
  2. i = 1
  3. >> while i<=5,
  4. v(i)=100;
  5. i=i+1;
  6. end;
  7. >> v
  8. v =
  9. 100
  10. 100
  11. 100
  12. 100
  13. 100
  14. 36
  15. 49
  16. 64
  17. 81
  18. 100
  19. % break使用
  20. >> i=1;
  21. >> while i<=10,
  22. v(i)=999;
  23. if i==6,
  24. break;
  25. i=i+1;
  26. end;
  27. >> i=1;
  28. >> while i<=10,
  29. v(i)=999;
  30. i=i+1;
  31. if i==6,
  32. break;
  33. end;
  34. end;
  35. >> v
  36. v =
  37. 999
  38. 999
  39. 999
  40. 999
  41. 999
  42. 36
  43. 49
  44. 64
  45. 81
  46. 100




if语句

  1. >> v(1)=2
  2. v =
  3. 2
  4. 999
  5. 999
  6. 999
  7. 999
  8. 36
  9. 49
  10. 64
  11. 81
  12. 100
  13. >> v(1)=2;
  14. >> if v(1)==2,
  15. disp('the value is 2');
  16. elseif v(1)==1;
  17. disp('the value is 1');
  18. else
  19. disp('the value is not 1 or 2');
  20. end;
  21. the value is 2




函数

  1. % 函数定义 在.m文件定义
  2. % sqrtThisNumber.m
  3. function y=sqrtThisNumber(x)
  4. y=sqrt(x);
  5. % 一个函数返回多个值
  6. function [y1 y2]=squareAndcubeThisNumber(x)
  7. y1=x^2;
  8. y2=x^3;
  9. % 定义结束
  10. >> [y1 y2]=squareAndcueThisNumber (5)
  11. y1 = 25
  12. y2 = 125
  13. % 函数使用
  14. % 可以先添加路径
  15. addpath('D:\.machinie')
  16. >> sqrtThisNumber(5)
  17. ans = 2.2361


  1. % 应用于房价预测模型
  2. function J=costFunctionJ(X, y, theta)
  3. m=size(X,1); %样本数
  4. predictions=X*theta; %假设函数
  5. sqrErrors=(predictions-y).^2; %方差
  6. J=1/(2*m)*sum(sqrErrors); %代价函数
  7. % 定义结束
  8. >> X=[1 1;1 2;1 3];
  9. >> y=[1;2;3];
  10. >> theta=[0;1];
  11. >> j=costFunctionJ (X,y,theta);
  12. >> j
  13. j = 0

pic10



矢量

向量化操作



以此假设函数为例,你可以从j=0加到j=n但你同时也可以把θx当作向量,再用θTx相乘(即求内积)得到hθ



下面用Octave代码解释一下

  1. % 非向量化操作
  2. prediction = 0.0;
  3. for j = i : n + 1,
  4. preiction = prediction + theta(j) * x(j);
  5. end;
  6. % 向量化操作
  7. prediction = theta' * x;

可以看出使用向量化操作可以大大简化代码

  1. // C++代码非向量化操作
  2. double prediction = 0.0;
  3. for (int j = 0; j <= n; ++j)
  4. prediction += theta[j] * x[j];
  5. // C++向量化操作
  6. double prediction = theta.transpose() * x;





下面再看梯度下降算法地更新过程用向量化方法简化地例子:





同样的把θ看作是向量,接下来要做的是把右边的部分看作向量,α和本身是实数,同时也是一个实数,所以只要把_j^{(i)}$看作向量就可以向量化操作了。



添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注