Coursera—Andrew Ng机器学习—课程笔记 Lecture 5 Octave Tutorial

5.1 基本操作

  参考视频: 5 - 1 - Basic Operations (14 控制输出格式的长短 min).mkv

 5.1.1  简单运算

不等于符号的写法是这个波浪线加上等于符号 ( ~= ),而不是等于感叹号加等号( != )

1 1 == 1    %  判断相等
2 1 ~= 2    %  判断不等
3 1 && 0     %  求逻辑与
4 1 || 0     %  求逻辑或
5 xor(1, 0)   % 求异或

 简化命令行

PS1('>> ');

分号 semicolon 不打印结果 

 >> a = 3;  %semicolon supressing output

 浮点数的输出

1 >> a = pi;
 3 >> a
 5 a =  3.1416
 6 >> disp(a);
 8  3.1416
 9 >> disp(sprintf('2 decimals: %0.2f', a))  %c语言的旧式写法
11 2 decimals: 3.14
12 >> disp(sprintf('6 decimals: %0.6f', a))
14 6 decimals: 3.141593

 控制输出格式的长短

1 >> format long
 3 >> a
 5 a =  3.141592653589793
 6 >> format short
 8 >> a
10 a =  3.1416

5.1.2 向量和矩阵

1 >> A = [1 2; 3 4; 5 6]
 5    1   2
 6    3   4
 7    5   6
 9 >> A = [1 2;
11 3 4;
13 5 6]
17    1   2
18    3   4
19    5   6
21 >> v = [1 2 3]
25    1   2   3
27 >> v = [1; 2; 3]
31    1
32    2
33    3

 通过步长生成行向量

1 >> v = 1:0.1:2   %表明从1开始,步长为0.1,一直增加到2
 3 v =
 5  Columns 1 through 4:
 7     1.0000    1.1000    1.2000    1.3000
 9  Columns 5 through 8:
11     1.4000    1.5000    1.6000    1.7000
13  Columns 9 through 11:
15     1.8000    1.9000    2.0000
17 >> v = 1:6   
21    1   2   3   4   5   6

  全是1, 或者全是0 的矩阵

1 >> v = ones(2,3)
 5    1   1   1
 6    1   1   1
 8 >> v = ones
10 v =  1
11 >> v = ones(3)
15    1   1   1
16    1   1   1
17    1   1   1
19 >> v = 2*ones(2,3)
23    2   2   2
24    2   2   2
26 >> w = zeros(1,3)
30    0   0   0

 使用eye() 函数生成单位矩阵(eye is a pun for identity)

1 >> I = eye(6)
 7    1   0   0   0   0   0
 8    0   1   0   0   0   0
 9    0   0   1   0   0   0
10    0   0   0   1   0   0
11    0   0   0   0   1   0
12    0   0   0   0   0   1

矩阵大小

1 >> A = [1 2; 3 4; 5 6]
 5    1   2
 6    3   4
 7    5   6
15 >> sz = size(A) % 矩阵大小
19    3   2
21 >> size(sz)      
25    1   2
27 >> size(A,1)  % 矩阵行数
29 ans =  3
30 >> size(A,2)  % 矩阵列数
32 ans =  2
48 >> length(A)   % length输出矩阵最大维的大小
50 ans =  3

获取元素

>>  A = [1 2; 3 4; 5 6; 7 8; 9 10];
>> A(3,2)    % 获取一个元素
    6
>> A(2, :)    % 获取一行元素,冒号指所有列
    3   4
>> A([1 3], :)     % 返回 1、3 两行的元素
    1   2
    5   6
>>  A(2:4, :)     % 返回 2、3、4 三行元素(注意和上一个的区别)
   3   4
   5   6
   7   8

>>  A(2:3)    % 这里很奇怪,是从上到下依次返回
   3   5
>>  A(2:5)
   3   5   7   9
>>  A(1:10)
   1    3    5    7    9    2    4    6    8   10

 矩阵转置

>> A'
ans =

    1    3    5    7    9
    2    4    6    8   10

>> (A')'
ans =

    1    2
    3    4
    5    6
    7    8
    9   10

 5.1.3  矩阵赋值和拼接

 矩阵赋值

>> A=[1 2; 3 4; 5 6]
A =

   1   2
   3   4
   5   6

>> A(:,2)=[10; 11; 12]
A =

    1   10
    3   11
    5   12

 扩充矩阵

 1 >> A = [A , [100; 101; 102]]  % 给矩阵添加一列
 2 A =
 4      1    10   100
 5      3    11   101
 6      5    12   102
 8 >> A = [A ; [100 101 102]]  % 给矩阵添加一行
 9 A =
11      1    10   100
12      3    11   101
13      5    12   102
14    100   101   102

  矩阵转换成列向量

 1 >> A(:)    % 冒号含义很特殊,将A中所有元素都放于一个列向量中
 2 ans =
 4      1
 5      3
 6      5
 7    100
 8     10
 9     11
10     12
11    101
12    100
13    101
14    102
15    102  

  拼接两个矩阵

1 >> A = [1 2; 3 4; 5 6]
 2 A =
 4    1   2
 5    3   4
 6    5   6
 8 >> B = [11 12; 13 14; 15 16]
 9 B =
11    11   12
12    13   14
13    15   16
15 >> C = [A B]        % “横”着连接,前提是矩阵要同型才可以拼接
18     1    2   11   12
19     3    4   13   14
20     5    6   15   16
23 >> C = [A, B]       % “横”着连接
24 C =
26     1    2   11   12
27     3    4   13   14
28     5    6   15   16
30 >> C = [A; B]      % “竖”着连接
31 C =
33     1    2
34     3    4
35     5    6
36    11   12
37    13   14
38    15   16

5.1.4  随机数

  取随机数,定义维度,随机数大小总在0到1之间

1 >> w = rand(3,3)
3 w =
5    0.19782   0.42514   0.10275
6    0.83117   0.66312   0.37967
7    0.27300   0.92920   0.62790

生成一个一行三列的 高斯随机分布  

1 >> w = randn(1,3)
3 w =
5   -0.025352   0.023321   1.729415

生成一个一行10000列,均值为6的高斯随机分布矩阵

w = - 6 + sqrt(10) * (randn(1,10000));

使用hist()函数展示直方图

hist(w)

  生成50个条的直方图

>> hist(W,50)

5.2 移动数据

  参考视频: 5 - 2 - Moving Data Around (16 min).mkv 

pwd 指令:得到Octave默认路径;
cd 指令:change direction 即改变路径,自己指定路径,但路径名中不要包含汉字
ls 指令:列出默认路径中包含的所有路径或者文件
load test.dat : 加载文件中的数据到test变量中
load('test.dat') : 同上
test : 显示test变量里的数据内容
who/whos : 列出目前Octave工作空间中包含的所有变量
clear test : 删除工作空间的变量test
V = test(1 : 10) : 取test中的前十个赋值给变量v
save hello.mat V : 将变量V保存在hello.mat文件中,注意当再次加载进来时,变量的名称仍然是V 而非文件名hello

save hello.txt V -ascii: 存为可以看的 txt 文件

 从文件中加载数据到变量

1 >> ls              % 查看路径下的文件
  5  Directory of D:\myc_learn\machine_learning\code\week2
  6 
  7 [.]             [..]            featuresX.dat   priceY.dat
  8                2 File(s)            658 bytes
  9                2 Dir(s)  770,788,524,032 bytes free
 12 >> load featuresX.dat      % 使用load 加载房屋特征文件
 19 >> featuresX           % 打印featuresX
 20 featuresX =
 22    2343      3
 23    4343      6
 24    2222      3
 25    1245      2
 26    2345      5
 27    2234      2
 28    2123      6
 ... ...
 72 >> size(featuresX)    % 矩阵大小
 73 ans =
 75    47    2
 77 >> load('priceY.dat')  % 加载文件
 78 >> size(priceY)
 79 ans =
 81    47    1

  使用who 和whos 查看都有哪些变量

1 >> who
 2 Variables in the current scope:
 4 A          ans        featuresX  priceY     sz
 6 >> whos
 7 Variables in the current scope:
 9    Attr Name           Size                     Bytes  Class
10    ==== ====           ====                     =====  =====
11         A              3x2                         48  double
12         ans            1x2                         16  double
13         featuresX     47x2                        752  double
14         priceY        47x1                        376  double
15         sz             1x2                         16  double
17 Total is 151 elements using 1208 bytes

 删除变量

1 >> clear featuresX
2 >> who
3 Variables in the current scope:
5 A       ans     priceY  sz

保存变量到文件

1 >> V = priceY(1:10)        % 将priceY的前10个元素赋值给V
 2 V =
 4    3048
 5    4702
 6    6069
 7    5001
 8    6321
 9    3274
10    2183
11    4205
12    8270
13    7704
15 >> save hello.mat V        % 将V保存到文件hello.dat中
16 >> clear V            % 清除变量V
18 >> whos                % 查看都有哪些变量
19 Variables in the current scope:
21    Attr Name        Size                     Bytes  Class
22    ==== ====        ====                     =====  =====
23         A           3x2                         48  double
24         ans         1x2                         16  double
25         priceY     47x1                        376  double
26         sz          1x2                         16  double
28 Total is 57 elements using 456 bytes

 保存的 hello.mat 是二进制格式。 如果保存成 dat 格式,文件中数据如下

从文件中加载回变量V

1 >> load hello.mat
 2 >> whos
 3 Variables in the current scope:
 5    Attr Name        Size                     Bytes  Class
 6    ==== ====        ====                     =====  =====
 7         A           3x2                         48  double
 8         V          10x1                         80  double
 9         ans         1x2                         16  double
10         priceY     47x1                        376  double
11         sz          1x2                         16  double
13 Total is 67 elements using 536 bytes
16 >> V
17 V =
19    3048
20    4702
21    6069
22    5001
23    6321
24    3274
25    2183
26    4205
27    8270
28    7704

 保存成可以看的 txt 文件

 save hello.txt V -ascii

因为用到房屋价格数据,干脆用Octave生成了一些随机数,粘贴进了文件 priceY.dat 里

1 A   = 10000 * rand(1,47)    % 生成47个0-1的随机数,并且乘以10000
2 disp(sprintf('%0.0f\n',A))   % 打印成整数形式

 5.3 计算数据

参考视频: 5 - 3 - Computing on Data (13 min).mkv

5.3.1 矩阵相乘

矩阵相乘  矩阵点乘

1 1> A = [1 2; 3 4; 5 6]
 7 3> C = [1 1 ; 2 2]
12 4> A * C    % 矩阵相乘
14     5    5
15    11   11
16    17   17
8 B =
 9    11   12
10    13   14
11    15   16
14 5> A .* B   % 矩阵点乘 各元素逐一相乘
16    11   24
17    39   56
18    75   96

 在每个元素上操作

A .^ 2      % 每个元素取平方
1 ./ A       % 取倒数 

5.3.2 向量计算

最大值

1 23> a = [1 15 2 0.5]
 5 24> val = max(a)
 6 val =  15
 8 25> [val, ind] = max(a)    % ind 返回最大值位置
 9 val =  15
10 ind =  2

 向量逻辑判断

1 a < 3      % 对每个元素进行逻辑判断
3   1  0  1  1
5 find(a < 3)  % 在上面进行逻辑判断的基础上,返回结果为真的索引
7    1   3   4

 向量常用函数向量运算

sum(a)     % 所有元素求和
prod(a)    % 所有元素相乘
floor(a)    % round down 向下取整
ceil(a)     % round up 向上取整round(a)     % 四舍五入std(a)      % 求标准差mean(a)      % 求平均值 abs([-1;2;-3])   % 取绝对值log(v)            % 取log
exp(v)            % 取e为底的指数, e=2.71828

向量运算

1 12> v
 3    1
 4    2
 5    3
14 15> -v
16   -1
17   -2
18   -3
20 16> v + ones(length(v), 1)
22    2
23    3
24    4
26 18> ones(3,1)
28    1
29    1
30    1
32 19> v + ones(3,1)
34    2
35    3
36    4
38 20> v + 1
40    2
41    3
42    4

5.3.1 矩阵最大值

随机矩阵中的最大值

1 >> rand(3)
 3    0.64927   0.22644   0.61599
 4    0.87125   0.68797   0.60553
 5    0.69778   0.25321   0.12596
 7 >> max(rand(3), rand(3))  % 随机矩阵中的最大值
 9    0.51841   0.89632   0.75562
10    0.21897   0.68484   0.75206
11    0.97807   0.73515   0.75578

 求矩阵的行最大值、列最大值   element-wise comparison

1 >> A
 3    8   1   6
 4    3   5   7
 5    4   9   2
 7 >> max(A)    % 返回每一列的最大值
 9    8   9   7
11 >> max(A,[],1)  % 返回每一列的最大值
13    8   9   7
15 >> max(A,[],2) % 返回每一行的最大值
17    8
18    7
19    9

 两种求矩阵中所有元素最大值的方法

1 >> max(max(A))
2 ans =  9
3 >> max(A(:)) 
4 ans =  9

5.3.1 矩阵相乘

A = magic(3)           % 生成一个magic squares。其行、列、对角线 元素和等于同一个数
[r,c] = find(A>=7)      %返回符合条件元素的行坐标和列坐标
sum(A,1)             % 矩阵每一列相加
sum(A,2)          % 矩阵每一行相加
A .* eye(9)        % 矩阵主对角线的值
sum(sum(A .* eye(9)))    % 主对角线求和
flipud(eye(9))          % 次对角线的值
sum(sum(A .* flipud(eye(9))))  % 次对角线求和
1 33> A = magic(3) 
 3    8   1   6
 4    3   5   7
 5    4   9   2
 7 34> [r,c] = find(A>=7) % 返回符合条件元素的行坐标和列坐标
 8 r =
 9    1
10    3
11    2
13 c =
14    1
15    2
16    3     % 即(1,1)(3,2)(2,3)三个元素>=7

矩阵列相加,行相加

1 >> A = magic(9)
 3    47   58   69   80    1   12   23   34   45
 4    57   68   79    9   11   22   33   44   46
 5    67   78    8   10   21   32   43   54   56
 6    77    7   18   20   31   42   53   55   66
 7     6   17   19   30   41   52   63   65   76
 8    16   27   29   40   51   62   64   75    5
 9    26   28   39   50   61   72   74    4   15
10    36   38   49   60   71   73    3   14   25
11    37   48   59   70   81    2   13   24   35
13 >> sum(A,1)        % 矩阵每一列相加
15    369   369   369   369   369   369   369   369   369
17 >> sum(A,2)       % 矩阵每一行相加
19    369
20    369
21    369
22    369
23    369
24    369
25    369
26    369
27    369

矩阵主对角线的值

1 >> A .* eye(9)  % 矩阵主对角线的值
 4    47    0    0    0    0    0    0    0    0
 5     0   68    0    0    0    0    0    0    0
 6     0    0    8    0    0    0    0    0    0
 7     0    0    0   20    0    0    0    0    0
 8     0    0    0    0   41    0    0    0    0
 9     0    0    0    0    0   62    0    0    0
10     0    0    0    0    0    0   74    0    0
11     0    0    0    0    0    0    0   14    0
12     0    0    0    0    0    0    0    0   35
14 >> sum(sum(A .* eye(9)))   % 主对角线求和
15 ans =  369

矩阵次对角线的值

1 >> flipud(eye(9))    % 次对角线的值
 6    0   0   0   0   0   0   0   0   1
 7    0   0   0   0   0   0   0   1   0
 8    0   0   0   0   0   0   1   0   0
 9    0   0   0   0   0   1   0   0   0
10    0   0   0   0   1   0   0   0   0
11    0   0   0   1   0   0   0   0   0
12    0   0   1   0   0   0   0   0   0
13    0   1   0   0   0   0   0   0   0
14    1   0   0   0   0   0   0   0   0
16 >> sum(sum(A .* flipud(eye(9))))  % 次对角线求和
17 ans =  369

 5.4 绘制数据图

 参考视频: 5 - 4 - Plotting Data (10 min)

5.4.1 绘制曲线

  1、画一个sin曲线

1 >> t = [0:0.01:0.98];
2 >> y1 = sin(2 * pi * 4 * t);
3 >> plot(t,y1);

    2、画一个cos曲线

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

3、将两个曲线合并在一起 

1 >> plot(t,y1);
2 >> hold on
3 >> plot(t,y2,'r');

 4、给图像添加信息

1 > xlabel('time')    % X轴标签
2 >> ylabel('value')   % Y轴标签
3 >> legend('sin','cos')  % 添加曲线名称
4 >> title('my plot')  % 添加标题

  5、保存到文件

1 >> print -dpng 'myPlot.png'
2 >> ls
3  Directory of D:\myc_learn\machine_learning\code\week2
5 [.]             5.m             hello.dat       myPlot.png
6 [..]            featuresX.dat   hello.txt       priceY.dat
9 >> close

6、绘制多张图

   绘制多张图,需要指定将哪个曲线放在哪个图中。否则会一直绘制在当前窗口,覆盖之前的图形

1 >> figure(1); plot(t,y1);  % 在figure1中绘制

2 >> figure(2); plot(t,y2);  % 在figure2中绘制

7、将两个图显示在一张图片中

1 >> subplot(1,2,1);  % 将图片划分为两个格子,访问第一个格子
2 >> plot(t,y1)    % 画第一个图像
3 >> subplot(1,2,2);  % 访问第二个格子
4 >> plot(t,y2)    % 画第二个图像

8、改变坐标轴范围

1 >> axis([0.5 1 -1 1])

 点击一下第一张图片,再运行一下上面那行代码,图变为: 

9、清空和关闭图片

1 >> clf    % 清空
2 >> close   % 关闭

5.4.2 绘制可视化矩阵

1、生成矩阵图

  根据矩阵的值生成图像,不同的颜色对应矩阵中不同的值

>> A = magic(5)
A =
   17   24    1    8   15
   23    5    7   14   16
    4    6   13   20   22
   10   12   19   21    3
   11   18   25    2    9
>> imagesc(A)

 2、显示颜色条

1 >> colorbar

 

 或者直接使用下面的一行代码:

1 >> imagesc(magic(5)), colorbar;

 3、生成灰度图

1 >> imagesc(A), colorbar, colormap gray;

 生成一个15行15列灰度图

1 >> imagesc(magic(15)),colorbar,colormap gray;

以 imagesc(magic(15)),colorbar,colormap gray; 为例。

  这种几个逗号隔开的命令一起运行的方式,叫做逗号连接函数调用 comma chaining of function calls 或 comma chaining commands 。

  比如赋值操作可以写成:a=1, b=2, c=3;

 5.4.3 散点图

1   plot(x,y,'rx', 'MarkerSize', 10);
2   xlabel('Population of City in 10,000s');
3   ylabel('Profit in $10,000s');
4   title('POPULATION AND PROFIT');

图像绘制在Octave官方文档的 15.2.1 Two-Dimensional Plots ,图形属性设置在15.3.3.4 Line Properties。

如果想设置某个属性,直接写属性名,后面跟一个值。plot (x, y, property, value, …)

  例如  plot (x, y, 'linewidth', 2, …);

5.5 控制语句: for, while, if 语句

  参考视频: 5 - 5 - Control Statements_ for, while, if statements (13 min).mkv

1、for 循环 通过 index 访问列向量

>> v = zeros(10,1)
v =
   0
   0
   0
   0
   0
   0
   0
   0
   0
   0
>> for i = 1 : 10,
     v(i) = 2 ^ i;
   end;
>> v
v =
      2
      4
      8
     16
     32
     64
    128
    256
    512
   1024

 2、for 循环 直接访问列向量元素

>> indices = 1 : 10;
>> indices
indices =
    1    2    3    4    5    6    7    8    9   10
>> for i = indices,
      disp(i);
   end;
 1
 2
 3
 4
 5
 6
 7
 8
 9
 10

 3、while 循环访问列向量

>> i = 1;
>> while i <= 5,
      v(i) = 100;
      i = i + 1;
   end;
>> v
v =
    100
    100
    100
    100
    100
     64
    128
    256
    512
   1024

4、while(true) 和 break

>> i = 1 ;
>> while(true),
     v(i) = 999;
     i = i + 1;
     if i == 6,
        break;
     end;
   end;
>>
>> v
v =
    999
    999
    999
    999
    999
     64
    128
    256
    512
   1024

5、if else 语句

>> v(1) = 2;
>> if v(1) == 1,
      disp('The value is one');
   elseif v(1) == 2,
      disp('The value is two');
   else,
      disp('The value is not one or two');
   end;
The value is two

6、自定义函数 function

  定义函数 squareThisNumber(x),内容如下: 

1 function y = squareThisNumber(x)
2   y = x^2;
3 endfunction

将函数保存为squarethisnumber.m,注意此时是小写。

  这时候调用函数 squareThisNumber(2) 提示找不到函数

>> squareThisNumber(2);
error: 'squareThisNumber' undefined near line 1 column 1
>>
>> ls
[.]                         featuresX.dat               priceY.dat
[..]                        hello.dat                   squarethisnumber.m

将文件命名为函数一致squareThisNumber.m(大小写也一致),这时候调用函数成功

>> ls
[.]                         featuresX.dat               priceY.dat
[..]                        hello.dat                   squareThisNumber.m
>> squareThisNumber(2);
>> a = squareThisNumber(2);
>> a
a =  4

 这说明:Octave 是大小写敏感的,文件名必须和函数名大小写一致。

7、多个返回值的函数

  Octave 函数有和其他语言不一样的地方是可以返回多个值。定义方法squareAndCubeThisNumber(x)如下:

1 function [y1, y2] = squareAndCubeThisNumber(x),
2   y1 = x ^ 2;
3   y2 = x ^ 3;
4 endfunction

 调用:

1 >> a = squareAndCubeThisNumber(2)  % 接受了第一个返回值
2 a =  4
3 >> [a, b] = squareAndCubeThisNumber(2)  % 接受两个返回值
4 a =  4
5 b =  8

8、更复杂的函数

  保存下面的函数到costFunctionJ.m中

 1 function J = costFunctionJ(X, y, theta),
 2   % X is the "design matrix" containing our training examples
 3   % y is the class labels
 4   
 5   m = size(X, 1);   % number of training examples, size of rows
 6   predictions = X * theta; % predictions of hapothesis on all m examples
 7   sqrErrors = (predictions - y) .^ 2; % squared errors .^ 指的是对数据中每个元素平方
 8   
 9   J = 1 / (2 * m) * sum(sqrErrors); 
10   
11 endfunction

 针对上边的数据集初始化矩阵。调用函数,计算代价函数的值。

1 >> X = [1 1; 1 2 ; 1 3];
2 >> y = [1;2;3];
3 >> theta = [0;1];      % Θ为0,1  h(x)=x  此时完全拟合数据,代价函数的值为0
4 >> j = costFunctionJ(X,y,theta)
5 j = 0
1 >> theta = [0;0];      % Θ 为0,0 h(x)=0 此时不能拟合数据
2 >> j = costFunctionJ(X,y,theta)
3 j =  2.3333
4 
5 >> (1^2 + 2^2 + 3^2) / (2*3)  % 代价函数的值
6 ans =  2.3333

5.6 向量化 Vectorization

  参考视频: 5 - 6 - Vectorization (14 min).mkv

  下面是向量化的小例子,如果将所有u(j) 、所有v(j)、所有w(j)都看成列向量,则公式变为为向量加法 u = 2v + 5w

   再复杂一些,在线性回归中 h(x) 的公式如下:

   假设此时n=2,只有两个特征。将其向量化:

  在Octave中,如果使用for循环实现,则为左边的代码。使用看做向量相乘,则只需要右边一行代码:

 

   在C++中,for循环和向量化方法的对比如下:


  当 n = 2 时,梯度下降的公式如下:

   实现这三个方程的方式之一,是用一个 for 循环,让 j 分别等于 0、1、2 来更新 Θj。

  因为三个参数是同步更新,可以用向量化的方法来实现。我们使用 δ 替代公式中下面这项(注意最右边 x 没有下标):

 

  则δ是一个 n+1 维向量(在这里是3维)

  α 是一个实数,α δ 也是 n+1 维向量


  x(i) 是一个 n+1 维向量(在这里是3维)

   公式变为一个向量减法:

    Θ := Θ -  α δ

   有时我们使用几十或几百个特征量来计算线性归回,当使用向量化地实现线性回归,通常运行速度就会比 for 循环快的多

相关术语

digram 对角线

plot 制图

semicolon 分号

column vector 列向量

row vector 行向量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/25191.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

jsp基于 JavaWeb+springboot 的校园快递驿站管理系统

不同的系统提供的服务也不相同&#xff0c;其对应的功能也不相同&#xff0c;所以&#xff0c;系统开工前&#xff0c;需要明确其用途&#xff0c;确定其功能。由此&#xff0c;才可以进行各个任务的开展。 校园驿站管理系统经过分析&#xff0c;确定了其需要设置管理员的角色&…

聚焦2023北京安博会,超高清安防应用将成潮流

&#xff08;1&#xff09;2023北京安博会 中国安全防范产品行业协会主办并承办的第十六届&#xff08;2023&#xff09;中国国际社会公共安全产品博览会&#xff08;Security China 2023&#xff09;&#xff0c;将于2023年6月7&#xff5e;10日在北京首钢会展中心开幕。安博…

前端vscode插件bito

GPT-4和ChatGPT越来越火&#xff0c;前端人员是否也能在日常工作中尝试体验其带来的乐趣呢&#xff1f; 答案是可以的&#xff01;安排&#xff01;&#xff01; 今天介绍一款vscode的插件 【bito】。 安装 安装后只需要自己注册一下&#xff0c;创建一个workspace就可以使用…

实验室信息系统源码,LIS源码

实验室信息系统源码&#xff0c;LIS源码 技术细节&#xff1a; SaaS架构的Client/Server应用 体系结构&#xff1a;Client/Server架构 客户端&#xff1a;WPFWindows Forms 服务端&#xff1a;C# .Net 数据库&#xff1a;Oracle 接口技术&#xff1a;RESTful API HttpW…

全面解析Linux指令和权限管理

目录 一.指令再讲解1.时间相关的指令2.find等搜索指令与grep指令3.打包和压缩相关的指令4.一些其他指令与热键二.Linux权限1.Linux的权限管理2.文件类型与权限设置3.目录的权限与粘滞位 一.指令再讲解 1.时间相关的指令 date指令: date 用法&#xff1a;date [OPTION]… [FOR…

如何在Linux中更改SSH端口?

SSH&#xff08;Secure Shell&#xff09;是一种安全的远程登录协议&#xff0c;它允许您通过网络远程连接到Linux系统并进行管理操作。默认情况下&#xff0c;SSH使用22端口进行通信。然而&#xff0c;为了增强系统的安全性&#xff0c;有时候我们需要更改SSH端口&#xff0c;…

linux 找回root密码(CentOS7.6)

linux 找回root密码(CentOS7.6) 首先&#xff0c;启动系统&#xff0c;进入开机界面&#xff0c;在界面中按“e”进入编辑界面。如图 2. 进入编辑界面&#xff0c;使用键盘上的上下键把光标往下移动&#xff0c;找到以““Linux16”开头内容所在的行数”&#xff0c;在行的最后…

C4D R26 渲染学习笔记 建模篇(2):手动建模

文章目录 前文回顾介绍篇建模篇 手动建模建模快捷键手动模型快捷键大全常用操作N系快捷键K系快捷键U系快捷键 结尾 前文回顾 介绍篇 C4D R26 渲染学习笔记&#xff08;1&#xff09;&#xff1a;C4D版本选择和初始UI框介绍 C4D R26 渲染学习笔记&#xff08;2&#xff09;&am…

Dubbo高可用

1.zookeeper宕机与dubbo直连 1.1.现象&#xff1a;zookeeper注册中心宕机&#xff0c;还可以消费dubbo暴露的服务。 原因&#xff1a; 监控中心宕掉不影响使用&#xff0c;只是丢失部分采样数据数据库宕掉后&#xff0c;注册中心仍能通过缓存提供服务列表查询&#xff0c;但…

软考A计划-试题模拟含答案解析-卷十二

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

AB Test数学原理及金融风控应用

1 什么是AB Test AB测试是一种常用的实验设计方法&#xff0c;用于比较两个或多个不同处理或策略的效果&#xff0c;以确定哪个处理或策略在某个指标上表现更好。在AB测试中&#xff0c;将随机选择一部分用户或样本&#xff0c;将其分为两个或多个组&#xff0c;每个组应用不同…

Java: IO流

1.定义 IO流:存储和读取数据的解决方案 用于读写文件中的数据&#xff08;可以读写文件&#xff0c;或网络中的数据...) 2.IO流的分类 1.按着流的方向 1.输入流&#xff1a;读取 2.输出流&#xff1a;写出 2.按照操作文件类型 1.字节流&#xff1a;所有类型文件 体系&…

机器学习-5 朴素贝叶斯算法

朴素贝叶斯算法 算法概述数理统计学处理的信息古典学派和贝叶斯学派的争论贝叶斯定理朴素贝叶斯分类训练朴素贝叶斯&#xff1a;朴素假设案例&#xff1a;预测打网球拉普拉斯平滑技术小结 算法流程与步骤算法应用sklearn中的朴素贝叶斯朴素贝叶斯的使用算法实例 算法概述 数理…

【服务器】使用Nodejs搭建HTTP web服务器

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 前言 1.安装Node.js环境 2.创建node.js服务 3. 访问node.js 服务 4.内网穿透 4.1 安装配置cpolar内网穿透 4.2 创建隧道映射本地端口 5.固定公网地址 [TOC] 转载自内网穿透…

一个完整的APP定制开发流程是怎样的?

随着移动互联网的发展&#xff0c;越来越多的 APP应用软件进入人们的生活&#xff0c;让我们的生活更便捷、更舒适。而随着互联网技术的进步&#xff0c;移动互联网应用软件开发行业也越来越成熟&#xff0c;为了适应市场需求&#xff0c;各种功能强大、性能良好的 APP应用软件…

C/C++ ---- 内存管理

目录 C/C内存分布 常见区域介绍 经典习题&#xff08;读代码回答问题&#xff09; 选择题 填空题 C语言内存管理方式 malloc/free calloc realloc C内存管理方式 new和delete操作内置类型 new和delete操作自定义类型 operator new和operator delete函数 new和dele…

C++11常用的一部分新特性

C11 统一的列表初始化&#xff5b;&#xff5d;初始化std::initializer_list 声明autodecltypenullptr STL中一些变化新容器已有容器的新接口 右值引用和移动语义左值引用和右值引用右值引用使用场景和意义右值引用引用左值及其一些更深入的使用场景分析完美转发 新的类功能默认…

opencv_c++学习(二十四)

一、积分图像 积分图像是对原图像进行积分操作的算法。如上图左所示&#xff0c;不同颜色代表不同区域。当我们想求取一个像素点的积分值时&#xff0c;我们需要求取该点左上方区域的数据之和&#xff0c;如P0的积分值是浅蓝色区域的数据之和。 P1的积分值为蓝色和橙色区域的数…

网页JS自动化脚本(八)使用网页专属数据库indexedDB进行数据收集

我们在网页上进行的活动,往往都需要进行收集一些简单的数据,但是因为浏览器的安全原因,浏览器基本上是无法与本地的操作系统直接产生数据交互的,这本来就是一个由于安全问题生产的无解问题,在浏览器里面是内置了几种数据库的,其中一种就是indexedDB,可以用来储存一些非常小的数…

C++进阶 —— 线程库(C++11新特性)

十&#xff0c;线程库 thread类的简单介绍 在C11之前涉及多线程问题&#xff0c;都是和平台相关的&#xff0c;如windows和Linux下各有自己的接口&#xff0c;这使代码的可移植性较差&#xff1b;C11中最重要的特性就是对线程进行支持&#xff0c;使得C在并行编程时不需要依赖…
最新文章