机器学习(1)-Octive语言

xiaoxiao2021-02-28  150

Octive语言

1、基本语法


(1)数学运算

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

(2)逻辑运算

>> 11==2 %逻辑运算 ans = 0 >> 2==2 ans = 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.14159265358979 format long %控制输出长短格式的快捷命令 >> x x = 3.14159265358979 >> format short >> x x = 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' >>pwd ans = C:\Users\ADMINI~1\intel >>ls %列出当前目录和文件 load 文件名 %加载文件,注意文件编码文ANSI,不支持中文 load('文件名') %以函数的形式 如: load featuresX.dat load 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 10 3 11 5 12 >> a = [a, [100;101;102]] %在矩阵a后面添加一列 则: a = 1 10 100 3 11 101 5 12 102 A(:) %将矩阵A的所有组成一列 1 10 100 3 11 101 5 12 102 C = [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*C A^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 = 3 ones(3,1) ans = 1 1 1 >>v + ones(length(v), 1) %等于v + [1;1;1] 等价于v + 1; v .+ 1 ans = 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,得到索引ids val = 15 idx = 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 = 4 y2 = 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;
转载请注明原文地址: https://www.6miu.com/read-75007.html

最新回复(0)