机器学习(1)-Octive语言

来源:互联网 发布:日本制造知乎 编辑:程序博客网 时间:2024/05/12 23:48

Octive语言

1、基本语法


(1)数学运算

>>5+5ans =  10>> 3-2ans =  1>> 2^6ans =  64

(2)逻辑运算

>> 11==2  %逻辑运算ans = 0>> 2==2ans = 1>> 1~=2 %不等于ans = 1>> xor(1,0)    %异或

(3)变量

>> x = 7;    %加分号可抑制自动打印>> x    %不加则打印出结果x =  7>> x = pi;>> disp(sprintf('4 decimals: %0.4f', x));      %转为字符串,保留后4位小数4 decimals: 3.1416>> disp(sprintf('14 decimals: %0.14f', x));    %转为字符串,保留后14位小数14 decimals: 3.14159265358979format long   %控制输出长短格式的快捷命令>> xx =  3.14159265358979>> format short>> xx =  3.1416

(4)向量&矩阵

>> v = [1 ; 2 ; 3]

v =

1
2
3

>> m = [1 : 0.1 : 1.4;   %表示步幅为0.1的从1到1.4        2 : 0.1 : 2.4;        3 : 0.1 : 3.4]    m =

1.0000 1.1000 1.2000 1.3000 1.4000
2.0000 2.1000 2.2000 2.3000 2.4000
3.0000 3.1000 3.2000 3.3000 3.4000

>> w = randn(2,3)           %(高斯)随机生成2by3的矩阵w =

-0.63858 0.95909 -0.70297
-0.64368 0.28263 -0.32134

生成直方图

>>w = rand(10,9);>> hist(w)   %生成直方图

生成的直方图

生成单位矩阵

>>i = eye(3)i =Diagonal Matrix   1   0   0   0   1   0   0   0   1

2、移动数据


(1)size

>>A = [1 2; 3 4; 5 6]size(A) %返回A的尺寸,一个1*2的矩阵[m,n],表示m行n列,测试size(size(A))size(A,1) %返回矩阵的行数size(A,2) %返回矩阵的列数length(A) %返回矩阵的最大维度,此时返回3,但通常对向量执行length命令

(2)文件操作

>>pwd  %%打印当前路径ans = F:\octave-4.2.1>>cd'目录'   %进入某目录   如:>>cd 'intel'>>pwdans = C:\Users\ADMINI~1\intel>>ls %列出当前目录和文件load 文件名 %加载文件,注意文件编码文ANSI,不支持中文load('文件名') %以函数的形式如:load featuresX.datload priceY.dat

(3)查看删除变量

who %显示当先工作空间储存的变量whos %详细显示当先工作空间储存的变量clear x %删除变量clear %删除所有变量

(4)变量赋值

v = priceY(1:10); %将priceY变量的前10个元素存入v中

(5)保存到本地文件

save hello.mat v; %将变量v保存到文件中,以二进制形式load hello.mat;   %读取文件sace hello.txt;   %将变量v保存到文件中,以文本文件形式

(6)访问和更改矩阵行列和元素

A(3,2) %访问矩阵A的第3行第2列的元素A(2,:) %访问矩阵A的第2行的所有元素,结果也是一个矩阵A(:,2) %访问矩阵A的第2列的所有元素,结果也是一个矩阵A([1 3],:) %访问矩阵A的第1和3行的所有元素A(:,2) = [10 ; 11 ; 12] %给矩阵的第二列赋值则:a =1   103   115   12>> a = [a, [100;101;102]]  %在矩阵a后面添加一列则:a = 1    10   100 3    11   101 5    12   102A(:) %将矩阵A的所有组成一列110100311101512102C = [A B] %将矩阵直接连在一起,A在左边,B在右边;或者写成 [A, B]C = [A; B] %将矩阵直接连在一起,A在上边,B在下边(;意味着换行)

3、数据计算


(1)矩阵乘法

A = [1 2; 3 4; 5 6]B = [11 12; 13 14; 15 16]C = [1 1; 2 2]A*CA^2 %矩阵的自身乘法(必须是方形矩阵)

(2)按元素计算

A .* B %按元素乘 %若B为标量,可以写成*A .^ 2 %每个元素二次方,不可以简写成 ^,因为^2表示自身相乘v = [1;2;3]1 ./ v %v中每个元素取倒数

(3) 元素单元操作

log(v) %对每个元素取自然对数exp(v) %每个元素作为e的指数的值abs(v) %对每个元素取绝对值-v %对每一位取相反数

(4)元素双元操作

>>v = [1 ;        2 ;        3];>>length(v)ans = 3ones(3,1)ans =         1        1        1>>v + ones(length(v), 1) %等于v + [1;1;1] 等价于v + 1; v .+ 1ans =        2        3        4

(5)矩阵的转置、翻转

A'  %转置filpud(a)  %上下翻转filplr(a)  %左右翻转

(6)最大,最小,求和,乘积,取整

>> a = [1 15 2 0.5]>> val = max(a)   %对于行矩阵,取矩阵中的最大元素的值val =  15>> [val,idx] = max(a)   %把矩阵a中最大的元素赋值给val,得到索引idsval =  15idx =  2若不是行矩阵max(a)   %得到每一列的最大值,返回矩阵max(a, b) %矩阵A、B相同位置的元素相比取大的一个(ab矩阵同大小)max(a,[],1) %求每一列的最大值max(a,[],2) %求每一行的最大值sum(a) %所有元素相加得到的值sum(a,1) %按列求和sum(a,2) %按行求和 prod(a)  %同一列的元素相乘floor(a) %对所有元素向下取整ceil(a) %对所有元素向上取整

(7)元素逻辑运算

a < 3  %对矩阵每个元素计算逻辑结果,输出由0和1组成的同大小矩阵

(8)查找元素

find(a < 3)  %返回行矩阵满足逻辑运算的的元素的索引[r,c] =  find(A>=7) %r为满足条件的元素的行号,c为满足条件的元素的列号

(9)magic方法

A = magic(3) %生成行/列/对角 相加都等于同一值的3*3矩阵(并卵)

(10)求逆

pinv(A) %求逆,pinv(A)*A = eye(n)

4、绘制及可视化数据


(1)绘制函数

t = [0:0.01:0.98]; %定义横坐标y1 = sin(2*pi*4*t); %定义纵坐标plot(t, y1) %绘制二维图形,t为横坐标,y1为纵坐标

这里写图片描述

若把纵坐标改成y2 = cos(2*pi*4*t);plot(t, y2) %重新绘制图形,t为横坐标,y2为纵坐标

这里写图片描述

二维图被替换成了新的
此时若要同时显示两个,则

plot(t, y1)  %先绘制出一个hold on  %保持图像plot(t, y2, 'r') %绘制第二个,颜色为红

这里写图片描述

(2)给函数图添加标注

保持hold状态时,

xlabel('time') %x轴的标签ylabel('value') %y轴的标签legend('sin', 'cos') %给两个曲线添加标注title('my plot') %图的标题

这里写图片描述

(3)将图保存到本地

print -dpng 'myPlot.png' %将图保存到本地close  %关闭图像

(4)将2个图像用2个窗口显示

figure(1) ;plot(t, y1);figure(2) ;plot(t, y2);

(5)将2个图像用1个窗口显示

subplot(1,2,1); %将窗口生成1*2的格子,接下来使用第1个格子,绘制出坐标系plot(t,y1);subplot(1,2,2) %将窗口生成1*2的格子,接下来使用第2个格子,绘制出坐标系plot(t,y2);clf  %清除窗口里的所有图像

(6)改变坐标系范围

axis([0.5 1 -1 1]) %横坐标范围为0.5~1,纵坐标的范围为-1~1

(7)使用色块可视化矩阵

A = magic(5) %创建幻方imagesc(A) %使用色块绘制幻方imagesc(A), colorbar, colormap gray %使用色块绘制矩阵A, 添加色标,将颜色映射到灰色

6、流程控制与函数


(1)基本结构与语句

控制语句 控制条件,    循环体;end;

if else if判断语句
if 条件1,
%语句;
elseif 条件2,
%语句;
else
%语句;
end;

if v(1) ==1, disp('v(1)=1');elseif v(1)==2, disp('v(1)==2');else disp('other');end;

for循环
for i=行向量,
%循环体;
end;

while continue break 循环
while 条件,
%循环体;
if 条件 %可选语句
break; %或者continue;
end;
end;

i=1;while i<=5,v(i) = 100;i = i+1;end;i=1;while true, v(i) = 100; i = i+1; if i==6  break; end;end;

while continue break 循环
while 条件,
%循环体;
if 条件 %可选语句
break; %或者continue;
end; %这个end结束的是if语句
end; %这个end结束的是while

i=1;while i<=5,v(i) = 100;i = i+1;end;i=1;while true, v(i) = 100; i = i+1; if i==6  break; end;end;

(2)函数创建与使用

  • 创建一个文件命名为函数名.m的函数文件

  • 编写函数(用写字板即可)
    这里写图片描述

  • 切换到函数文件所在的目录,或者将函数文件所在路径加入到搜索路径

    cd  '函数文件所在目录'或者addpath('目录的路径')
  • 在命令行执行函数

    >>[y1,y2]=squareThisNumber(2,2)y1 = 4y2 = 8

举例:计算线性回归中的代价函数的值
文件:cosFunctionJ.m
内容:

    function J = costFunctionJ(X, y, theta) %函数定义    % X为数据的矩阵    % y为class labels    m = size(X,1); %获取训练的组数,就是X的行数    predictions = X*theta; %每一组训练数据的带入假设函数后的值    sqrErrors = (predictions-y).^2; %算出误差    J = 1/(2*m) * sum(sqrErrors); %带入公式

则:

>>X = [1 1; 1 2; 1 3];>>y = [1; 2; 3];>>theta = [0; 1];>>costFunctionJ(X,y,theta)j = 0

7、向量化


无论你是用Octave,还是别的语言,比如MATLAB,或者你正在用Python、NumPy或Java、C,C++。所有这些语言都具有,各种线性代数库,这些库文件都是内置的,容易阅读和获取。他们通常写得很好,已经经过高度优化,通常是数值计算方面的博士,或者专业人士开发的。而当你实现机器学习算法时,如果你能,好好利用这些,线性代数库或者说,数值线性代数库,并联合调用它们。而不是自己去做函数库可以做的事情。你会发现这样更有效,运行速度更快。

(1)例子1

对于假设函数 hθ(x)=nj=0θjxj

可转化为 θTx

其中:
- θ为元素为θ0到θn的列向量
- x为元素为x0到xn的列向量

    prediction = theta' * X

(2)例子2

对于梯度下降算法中的公式
重复直到收敛{
θj:=θjα1mmi=1((hθ(x(i))y(i))x(i)j)
(同时更新对于每一个j =0,…,n)
}
可以转化为

θ:=θαδ

其中:
- θ 表示 n+1 维度的列向量
- α 表示一个标量
- δ 表示一个n+1维度的列向量;推导、定义如下
第一步:
δ=1mmi=1((hθ(x(i))y(i))x(i))
δ=1mfunc(Errors,X)
其中:
- Errors 为一个m维的列向量=Xθy
- X即其他见例子和正规方程
- func 是一个操作:Errors的每一元素(从1到m号)乘以X每一行(从1到m行)的每一个元素(从1到n+1列)得到一个矩阵,再转置,按照行求和,得到一个n+1维度的列向量

编程实现:

    Errors = X*theta - y;%    delta = (1/m)*(sum(Errors .* X)'); %此方法为以上分析得,标准方法如下    delta = (1/m)*X'*Errors;    theta = theta - alpha*delta;
0 0
原创粉丝点击