一.函数intlinprog的使用
1. intlinprog介绍
intlinprog是matlab中用于求解混合整数线性规划(Mixed-integer linear programming)的一个函数,用法基本和linprog差不多。
intlinprog函数有九个参数
大多数求解线性规划问题时,只用到前面8个参数,所以这里,我就详细的讲解前面8个参数的含义
1 2 3 4 5 6 7 8
| f :目标函数的系数矩阵 intcon :整数所在位置 A :不等式约束的变量系数矩阵 b :不等式约束的资源数 Aeq :等式约束的变量系数矩阵 beq :等式约束的资源数 lb :变量约束下限 ub :变量约束上限
|
2. 实例和代码
例1:
- 根据函数的使用要求;
- 求最大值,首先要把目标函数转化为最小值,即min z = - (2x+3y);
- 要把大于等于转换为小于等于,即在有 “≥” 符号式子两边同时乘以-1;
代码如下:
1 2 3 4 5 6
| f = [-2 -3]; intcon = []; A = [2,-1;-1,1;-1,-1]; b = [2;1;-1]; [x,fval] = intlinprog(f,intcon,A,b); x,fval = -fval
|
运行结果如下;
例2:
该问题是个0-1规划问题,加上限制条件即可,代码如下:
1 2 3 4 5 6 7 8 9 10
| c = [7 5 9 6 3]; intcon = [1,2,3,4,5]; a = [56,20,54,42,15;1,4,1,0,0;-1,-2,0,-1,-2]; b = [100;4;-2]; aeq=[]; beq=[]; lb = zeros(1,5); ub = ones(1,5); [x,fval]=intlinprog(c,intcon,a,b,aeq,beq,lb,ub)
|
1 2 3 4 5 6 7 8 9
| matlab结果如下: x = 0 0 0 0 1 fval = 3
|
3.补充说明:
使用intlinprog函数时,如果没有该参数所对应的限制条件,是用 [] 符号代替,不可以不写(在不打乱intlinprog函数参数顺序的前提下,如果后面都是[],可以省略不写)
二.函数fmincon的使用
1.简介
在matlab中,fmincon函数可以求解带约束的非线性多变量函数(Constrained nonlinear multivariable function)的最小值,即可以用来求解非线性规划问题
matlab中,非线性规划模型的写法如下
2. 基本语法
[x,fval]=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
参数介绍:
x的返回值是决策向量x的取值,fval的返回值是目标函数f(x)的取值
fun是用M文件定义的函数f(x),代表了(非)线性目标函数
x0是x的初始值
A,b,Aeq,beq定义了线性约束 ,如果没有线性约束,则A=[],b=[],Aeq=[],beq=[]
lb和ub是变量x的下界和上界,如果下界和上界没有约束,则lb=[],ub=[],也可以写成lb的各分量都为 -inf,ub的各分量都为inf
nonlcon是用M文件定义的非线性向量函数约束
options定义了优化参数,不填写表示使用Matlab默认的参数设置
3.实例
求下列非线性规划:
(1)编写fun.m文件存储参数f
1 2
| function f=fun(x) f=x(1)^2+x(2)^2+x(3)^2+8;
|
(2)编写nonlcon.m文件
1 2 3 4 5
| function [c,ceq]=nonlcon(x) c=[-x(1)^2+x(2)-x(3)^2 x(1)+x(2)^2+x(3)^2-20]; ceq=[-x(1)^2-x(2)^2+2 x(2)+2*x(3)^2-3];
|
(3)执行fmincon()函数
1 2 3 4 5 6 7
| a=[]; b=[]; aeq=[]; beq=[]; lb=zeros(1,3); ub=[]; [x,val]=fmincon('fun',[0 0 0],a,b,aeq,beq,lb,ub,'nonlcon')
|
⚠注意事项:
- 在书写[c,ceq]=nonlcon(x)函数时,c和ceq中若存在$2x_i^2$时,✖需要用 $*$ 表示出来。
- $x_0$的值必须要写!
- matlab中函数文件名必须要和对应的函数调用时的名字一样。
(4)运行结果1 2 3 4
| x = 0.6312 1.2656 0.9312 val = 10.8672
|
三.函数fmbnd() fminunc() fminsearch() 与fmincon()
1.求解一元无约束规划
[x, fval]= fminbnd (f,x1,x2)其中fun为目标函数,支持字符串,inline函数,句柄函数,[x1,x2]为优化区间。输出x为最优解,fval为最优值。
1.1 例1 求解一元非线性无约束函数
求函数$y=2e^{-x}sin(x)$在区间【0,8】上的最大值、最小值。
1.1.1 画图
1 2 3 4
| matlab代码如下: x=0:0.01:8; y=2*exp(-x).*sin(x); plot(x,y)
|
1.1.2 求最大值
代码 如下
1 2
| ymax='2*exp(-x)*sin(x)'; [xmin,fmin]=fminbnd(ymax,0,8)
|
答案是
1 2 3 4
| xmin = 3.9270 fmin = -0.0279
|
1.1.3 求最小值
tip:$fminbnd(y,start,end)$函数默认是求函数$y$的最大值,所以求最小值时我们需要将y函数变号。
matlab代码如下
1 2
| ymin='-2*exp(-x)*sin(x)' [xmax,fmax]=fminbnd(ymin,0,8)
|
答案是
1 2 3 4
| xmax = 0.7854 fmax = -0.6448
|
2 多元无约束优化
[x, fval]= fminunc(fun,x0)
[x, fval]= fminsearch(fun,x0)
其中:输入参数fun为目标函数,支持字符串,inline函数、句柄函数,x0为初值,必须得有
注意:fminunc,fminsearch只支持函数fun自变量单变量符号,如x(1),x(2)等
2.1 例2 求解多元非线性无约束函数
$$min \ z=100(x-y^2)^2+(1-y)^2$$
2.1.1 画图
1 2 3 4
| x=-1000:1:1000; y=x; z=100(x-y.^2).^2+(1-y).^2; plot3(x,y,z)
|
2.1.2 求解最小值
matlab代码如下:
1 2 3
| f='100*(x(1)-x(2)^2)^2+(1-x(2))^2'; [x,fval]=fminunc(f,[0,0]) [x_1,fval_1]=fminsearch(f,[0,0])
|
答案是
1 2 3 4 5 6 7 8
| x = 1.0000 1.0000 fval = 1.9474e-11 x_1 = 1.0000 1.0000 fval_1 = 3.6862e-10
|
2.1.3 区别
我们可以看到上面的结果是不同的,我们可以大胆猜一下可能是每个方法实现的算法不同。
知乎:fminunc与fminsearch函数的区别是什么?
两个都是求极小值,有区别吗?
张国王 中科院人工智能研究人员,主攻大规模遥感图像智能化解译
共同点:
算法属性:局部最优化算法
适用范围:无约束多变量最优化问题
不同点:两个函数使用的方法不一样
fminunc 采用拟牛顿法(QN),是一种使用导数的算法。参见拟牛顿法 分析与推导
fminsearch 采用Nelder-Mead单纯形法,是一种直接搜索法。参考单纯形法、Simplex Method
3.有约束优化
这就是我们前几天一直做的问题。
[x, fval]= fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
参数解释:fun为目标函数,支持字符串、inline函数,句柄函数,x0初值,A线性不等式约束系数、b线性不等式约束常数项、Aeq线性等式约束系数,线性beq等式约束常数,nonlcon非线性约束,支持句柄函数。
3.1 例3 求解非线性有约束函数
$$min \ f =x_1^2+4x_2^2+x_3^2$$
$$s.t. \ 3x_1+4x_2+x_3\geq13$$
$$x_1^2+x_2^2-x_3\leq100$$
$$3x_1^2+x_2^2-10\sqrt{x_3}\geq20$$
$$3x_1-x_2^2+x_3=50$$
$$x_1,x_2,x_3\geq0$$
3.1.1 画图
3.1.2 求最小值
matlab代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| function f=fun(x) f=x(1).^2+4*(2).^2+x(3).^2
function [c,ceq]=nonlcon(x) c=[x(1).^2+x(2).^2-x(3)-100 -3*x(1).^3-x(2).^2+10*x(3).^0.5+20] ceq=[3*x(1)-x(2).^2+x(3)-50]
x0=zeros(1,3) a=[-3 -4 -1] b=[-13] aeq=[] beq=[] lb=zeros(1,3) ub=[] [x,val]=fmincon('fun',x0,a,b,aeq,beq,lb,ub,'nonlcon')
|
答案是
1 2 3 4
| x = 10.8390 0.0005 17.4831 val = 439.1423
|
四.关于统计学的一些函数
1. 标准正态分布
1.1 概率密度函数图像
$$y=normpdf(x,mu,sigma)$$
1.1.1 参数说明
1 2 3
| mu:均值 sigma:标准差 y:正态概率密度函数在x处的值
|
1.1.2 例1
绘制标准正态分布的概率密度图像。
1 2 3 4 5
| x=-10:0.01:10 mu=0 sigma=1 y=normpdf(x,mu,sigma) plot(x,y)
|
1.2 分布函数图像
$$y=normcdf(x,mu,signma)$$
1.2.1 参数说明
1 2 3
| mu:均值 sigma:标准差 y:正态概率函数在x处的值
|
1.2.2 例2
绘制标准正态分布的分布函数图像。
1 2 3 4 5
| x=-10:0.01:10 mu=0 sigma=1 y=normcdf(x,mu,sigma) plot(x,y)
|
1.3 标准正态分布求分位数
概率密度函数求分位数:
$$norminv(α,mu,sigma)$$
概率分布函数求分位数:
$$norcdf(α,mu,sigma)$$
1.3.1 参数说明
1 2 3
| mu:均值 sigma:标准差 ans:α的分位数(即横坐标上的值)
|
1.3.2 求解标准正态分布α=0.5的分位数
1 2 3 4
| mu=0 sigma=1 norminv(0.5,mu,sigma) normcdf(0.5,mu,sigma)
|
答案是
2. 卡方分布
2.1 概率密度函数图像
$$y=chi2pdf(x,n)$$
2.1.1 参数说明
1 2
| n:卡方分布的自由度 y:卡方概率密度函数在x处的值
|
1.1.2 例1
绘制自由度n=2的卡方分布的概率密度图像。
1 2 3 4
| x=-10:0.01:10 n=2 y=chi2pdf(x,2) plot(x,y)
|
2.2 分布函数图像
$$y=chi2cdf(x,n)$$
2.2.1 参数说明
1 2
| n:卡方分布的自由度 y:卡方概率分布函数在x处的值
|
1.1.2 例1
绘制自由度n=2的卡方分布的概率分布图像。
1 2 3 4
| x=-10:0.01:10 n=2 y=chi2cdf(x,2) plot(x,y)
|
2.3 卡方分布求分位数
概率密度函数求分位数:
$$chi2inv(α,n)$$
概率分布函数求分位数:
$$chi2cdf(α,n)$$
2.3.1 参数说明
1 2
| n:卡方分布的自由度 ans:α的分位数(即横坐标上的值)
|
2.3.2 求解标准正态分布α=0.5的分位数
1 2 3
| n=2 chi2inv(0.5,n) chi2cdf(0.5,n)
|
答案是
1 2 3 4
| ans = 1.3863 ans = 0.2212
|
3.K-S检验
3.1 正态分布的K-S检验
$$H = kstest(X)$$
$$H = kstest(X,cdf)$$
1
| 指定累积分布函数为cdf的测试(cdf=[ ]时表示标准正态分布),测试水平为5
|
$$H = kstest(X,cdf,alpha)$$
$$H=kstest(X,cdf,alpha,tail) $$
1
| tail=0为双侧检验, tail=1单侧(<)检验, tail=-1单侧(>) 检验
|
$$[H,P,KSSTAT,CV] = kstest(X,cdf,alpha)$$
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| P为原假设成立的概率; KSSTAT为测试统计量的值; CV为是否接受假设的临界值。
#### 3.2 其他分布的K-S检验
![QQ图片20200727181059](https://s1.ax1x.com/2020/07/27/aFitHI.png)
#### 3.3 其他检验方法
lillietest检测方法较为严格,容错率低,但参数少。 > chi2gof适合大样本,一般要求50个以上 > kstest适于小样本, > lillietest用于正态分布,与kstest类似,适用于小样本 > jbtest,是通过峰度、偏度检测正态分布的,适用用大样本。
### 4. 求解分布函数置信区间
![20200727164241](https://s1.ax1x.com/2020/07/27/aFiaUP.png)
### 5.参考文章
[^1]: [matlab中kstest用法详解](https://blog.csdn.net/WUDIPIPIXIA/article/details/101939085) [^2]: [kstest官方文档](https://ww2.mathworks.cn/help/stats/kstest.html?s_tid=srchtitle)
## 五.函数adftest()
### 1. 函数调用
$h = adftest(x)$ $[h,pValue,stat,cValue,reg] = adftest(x) $
### 2. 功能介绍
**检验时间序列的稳定性。** h = adftest(x)通过对单变量时间序列中的单位根进行增强的Dickey-Fuller测试来返回具有拒绝决策的逻辑值Y。
### 3. 参数介绍
```shell h—测试拒绝决策(符合逻辑| 逻辑向量) 测试拒绝决策,以逻辑值或逻辑值向量的形式返回,其长度等于执行的测试次数。 * h = 1 表示拒绝使用单位根null表示支持替代模型。 * h = 0 表示无法拒绝单位根null。
pValue—测试统计p值(标量| 向量) 测试统计p值,以标量或向量的形式返回,其长度等于执行的测试次数。
* 如果检验统计量为't1'或't2',则p值为左尾概率。
* 如果检验统计量为'F',则p值为右尾概率。
stat—统计检验(标量| 向量)
测试统计信息,以标量或向量的形式返回,其长度等于执行的测试次数。adftest使用替代模型中系数的普通最小二乘(OLS)估计来计算测试统计量。
cValue—临界值(标量| 向量)
临界值,以标量或向量的形式返回,长度等于执行的测试次数。
* 如果测试统计量为't1'或't2',则临界值针对左尾概率。
* 如果检验统计量为'F',则临界值适用于右尾概率。
x— 单变量时间序列(单变量时间序列,指定为列向量。最后一个元素是最近的观察。adftest忽略由NaNs 表示的缺失观测值。)
|
4. 例
4.1 绘制y1,y2数据时序图
1 2 3 4
| t=(1:100)' y1=randn(100,1) y2=randn(100,1)+2*t plot(t,y1,t,y2)
|
4.2 绘制y1,y2自相关图像
1 2 3 4 5 6 7 8 9 10 11 12 13
| t=(1:100)' y1=randn(100,1) y2=randn(100,1)+2*t subplot(1,2,1) autocorr(y1) xlabel('t') ylabel('y1') title('y1自相关图像') subplot(1,2,2) autocorr(y2) xlabel('t') ylabel('y2') title('y2自相关图像')
|
4.3 用adftest求解稳定性
1 2 3 4 5 6
| t=(1:100)' y1=randn(100,1) y2=randn(100,1)+2*t plot(t,y1,t,y2) [h,p,s,cv]=adftest(y1) [h,p,s,cv]=adftest(y2)
|
答案是
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| h = logical 1 p = 1.0000e-03 s = -10.6932 cv = -1.9444 h = logical 0 p = 0.9990 s = 8.8428 cv = -1.9444
|
五.函数eig() eigs()
1.异同点
1.1 相同点
1.2 不同点
1 2
| eig函数主要是给出矩阵的特征值和特征向量 eigs函数主要是通过迭代法来求解矩阵特征值和特征向量
|
2.函数语法
$lambda = eig(A)$
$[V,D] = eig(A)$
$[V,D,P] = eig(A)$
$lambda = eig(vpa(A))$
$[V,D] = eig(vpa(A))$
3. 描述
1 2 3 4 5
| lambda = eig(A)返回包含方形符号矩阵特征值的符号向量A。 [V,D] = eig(A)返回矩阵V和D。的V当前特征向量的列A。对角矩阵D包含特征值。如果所得结果V的大小与相同A,则矩阵A具有满足的整套线性独立特征向量A*V = V*D。 [V,D,P] = eig(A)返回索引向量 P。的长度P等于线性独立的特征向量的总数,因此A*V = V*D(P,P)。 lambda = eig(vpa(A)) 使用变量精度算法返回数字特征值。 [V,D] = eig(vpa(A)) 还返回数字特征向量。
|
4.输入参数
5.例
1 2 3
| A=[-2 1 1;0 2 0;-4 1 3] [v,d]=eig(A) [v,d]=eigs(A)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 结果是: v = -0.7071 -0.2425 0.3015 0 0 0.9045 -0.7071 -0.9701 0.3015 d = -1 0 0 0 2 0 0 0 2 v = -0.2425 0.3015 -0.7071 0 0.9045 0 -0.9701 0.3015 -0.7071 d = 2 0 0 0 2 0 0 0 -1
|
六.内联函数、匿名函数和函数函数
题目相关链接
1. 字符串函数
1 2
| s='x(1)^2+x(2)^2+8' f=sym(s)
|
2. 字符串转化为内联函数
1 2 3 4
| s='x(1)^2+x(2)^2+8' f=inline(s) x=[8 9] f(x)
|
3. 字符串转化为匿名函数
1 2 3
| s='x(1)^2+x(2)^2+8' x=[8 9] f=eval(s)
|
4. 字符串转化为句柄函数
1 2 3 4 5 6
| function f=fun(x) f=x(1)^2+x(2)^2+8; end
x=[8 9] fun(x)
|
七.函数fprintf()
将数据写入文本文件
1.句法
$fprintf(fileID,formatSpec,A1,…,An)$
$fprintf(formatSpec,A1,…,An)$
$nbytes = fprintf( )$
2.描述
- fprintf(fileID,formatSpec,A1,…,An)按列顺序将应用于formatSpec数组的所有元素A1,…An,并将数据写入文本文件。fprintf使用对的调用中指定的编码方案fopen。
- fprintf(formatSpec,A1,…,An) 格式化数据并在屏幕上显示结果。
- nbytes = fprintf(___)fprintf使用前面语法中的任何输入参数,返回写入的字节数。
3.输入参数
- fileID— 文件标识符
1(默认)| 2| 标量
- formatSpec— 输出字段
格式的格式运算符
- A1,…,An— 数字或字符数组
标量 | 向量 | 矩阵 | 多维数组
4.输出参数
5.例
打印文字文本和数组值
在屏幕上打印多个数值和文字文本。
1 2 3 4 5 6 7 8
| A1 = [9.9,9900]; A2 = [8.8,7.7; ... 8800,7700]; formatSpec = 'X为%4.2f米或%8.3f毫米\ n' ; fprintf(formatSpec,A1,A2) X是9.90米或9900.000毫米 X是8.80米或8800.000毫米 X是7.70米或7700.000毫米
|
%4.2f在formatSpec输入规定,在输出的每一行的第一个值是与四位数字,包括小数点后两位数字的字段宽度的浮点数。%8.3f在formatSpec输入规定,在输出的每一行的第二个值是具有8位,包括小数点后三位数字的字段宽度的浮点数。\n是开始新行的控制字符。
将双精度值打印为整数
将带分数的双精度值显式转换为整数值。
1 2 3 4 5
| a = [1.02 3.04 5.06]; fprintf('%d \ n',round(a)); 1个 3 5
|
%d在formatSpec输入中,将向量中的每个值打印round(a)为有符号整数。\n是开始新行的控制字符。
将表格数据写入文本文件
将指数函数的简短表写入名为的文本文件exp.txt。
1 2 3 4 5 6
| x = 0:.1:1; A = [x; exp(x)]; fileID = fopen('exp.txt','w'); fprintf(fileID,'%6s%12s \ n','x','exp(x)'); fprintf(fileID,'%6.2f%12.8f \ n',A); fclose(fileID);
|
到第一个呼叫fprintf打印头文本x和exp(x),并且所述第二呼叫从可变打印中的值A。
如果您打算读取该文件的Microsoft ®记事本,使用’\r\n’,而不是’\n’移动到一个新行。例如,将调用替换fprintf为以下内容:
1 2
| fprintf(fileID,'%6s%12s \ r \ n','x','exp(x)'); fprintf(fileID,'%6.2f%12.8f \ r \ n',A);
|
MATLAB ®导入功能,所有的UNIX ®应用程序,和微软的Word和写字板识别’\n’为一个换行符指标。
使用type命令查看文件的内容。
1 2 3 4 5 6 7 8 9 10 11 12 13
| x exp(x)
0.00 1.00000000 0.10 1.10517092 0.20 1.22140276 0.30 1.34985881 0.40 1.49182470 0.50 1.64872127 0.60 1.82211880 0.70 2.01375271 0.80 2.22554093 0.90 2.45960311 1.00 2.71828183
|
获取写入文件的字节数
将数据写入文件并返回写入的字节数。
将数据数组写入A文件,并获取fprintf写入的字节数。
1 2 3
| A =魔法(4); fileID = fopen('myfile.txt','w'); nbytes = fprintf(fileID,'%5d%5d%5d%5d \ n',A)
|
字节= 96
该fprintf函数将96字节写入文件。
关闭文件。
使用type命令查看文件的内容。
1 2 3 4
| 16 5 9 4 2 11 7 14 3 10 6 15 13 8 12 1
|
在命令窗口中显示超链接
在屏幕上显示超链接(MathWorks网站)。
1 2 3 4
| url = 'https://www.mathworks.com' ; sitename = 'The MathWorks网站' ; fprintf('[%s ](%s) \ n',网址,站点名称)
|
八.数学上的常见基本函数[1]
1.绝对值和复数幅度
语法
$$Y = abs(X)$$
2.取模
除法(模运算)之后的余数。
语法
$$Y = mod(X)$$
例
1 2 3 4 5 6 7 8
| >> mod(5,2) ans =1 >> mod(-5,2) ans =1 >> mod(5,-2) ans =-1 >> mod(-5,-2) ans =-1
|
3.取余
除后余数。
语法
$$Y = rem(X)$$
1 2 3 4 5 6 7 8
| >> rem(5,2) ans =1 >> rem(5,-2) ans =1 >> rem(-5,2) ans =-1 >> rem(-5,-2) ans =-1
|
4.高斯取整函数
向零舍入。
语法
$$Y = fix(x)$$
例
1 2 3
| fix([2.4,3.7,-1.4,-4.7]) ans = 2 3 -1 -4
|
5.四舍五入函数
四舍五入到最接近的十进制或整数.
$$Y = round(x)$$
例
1 2 3
| round([2.4,3.7,-1.4,-4.7]) ans = 2 4 -1 -5
|
6.返回不大于x的最大整数值
向负无穷大舍入。
$$Y = floor(x)$$
例
1 2 3
| floor([2.4,3.7,-1.4,-4.7]) ans = 2 3 -2 -5
|
7.返回不小于x的最小整数值
向正无穷大方向舍入.
$$Y = ceil(x)$$
例
1 2 3
| ceil([2.4,3.7,-1.4,-4.7]) ans = 3 4 -1 -4
|
1 2 3 4 5 6
| data1.txt: 0 3886.162 2200.938 141.240 1 3721.139 2208.475 141.152 2 3866.200 2198.936 141.126 3 3678.048 2199.191 141.250 4 3685.453 2203.726 141.241
|
1 2 3 4 5 6 7 8 9
| 读取数据: data=load('data1.txt') dat1 = 1.0e+03 * 0 3.8862 2.2009 0.1412 0.0010 3.7211 2.2085 0.1412 0.0020 3.8662 2.1989 0.1411 0.0030 3.6780 2.1992 0.1412 0.0040 3.6855 2.2037 0.1412
|
1.format short:默认格式,小数点后保留4位
1 2 3 4 5 6 7
| dat1 = 1.0e+03 * 0 3.8862 2.2009 0.1412 0.0010 3.7211 2.2085 0.1412 0.0020 3.8662 2.1989 0.1411 0.0030 3.6780 2.1992 0.1412 0.0040 3.6855 2.2037 0.1412
|
2.format long:有效数字16位
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| dat1 = 1.0e+03 * 列 1 至 3 0 3.886162000000000 2.200938000000000 0.001000000000000 3.721139000000000 2.208475000000000 0.002000000000000 3.866200000000000 2.198936000000000 0.003000000000000 3.678048000000000 2.199191000000000 0.004000000000000 3.685453000000000 2.203726000000000 列 4 0.141240000000000 0.141152000000000 0.141126000000000 0.141250000000000 0.141241000000000
|
3.format long e:有效数字16位加3位指数
1 2 3 4 5 6 7 8 9 10 11 12 13
| dat1 = 列 1 至 2 0 3.886162000000000e+03 1.000000000000000e+00 3.721139000000000e+03 2.000000000000000e+00 3.866200000000000e+03 3.000000000000000e+00 3.678048000000000e+03 4.000000000000000e+00 3.685453000000000e+03 列 3 至 4 2.200938000000000e+03 1.412400000000000e+02 2.208475000000000e+03 1.411520000000000e+02 2.198936000000000e+03 1.411260000000000e+02 2.199191000000000e+03 1.412500000000000e+02 2.203726000000000e+03 1.412410000000000e+02
|
4.format short e:有效数字5位加3位指数
1 2 3 4 5 6
| dat1 = 0 3.8862e+03 2.2009e+03 1.4124e+02 1.0000e+00 3.7211e+03 2.2085e+03 1.4115e+02 2.0000e+00 3.8662e+03 2.1989e+03 1.4113e+02 3.0000e+00 3.6780e+03 2.1992e+03 1.4125e+02 4.0000e+00 3.6855e+03 2.2037e+03 1.4124e+02
|
5.format bank:保留两位小数位
1 2 3 4 5 6
| dat1 = 0 3886.16 2200.94 141.24 1.00 3721.14 2208.47 141.15 2.00 3866.20 2198.94 141.13 3.00 3678.05 2199.19 141.25 4.00 3685.45 2203.73 141.24
|
6.format +:只给出正负
1 2 3 4 5 6
| dat1 = +++ ++++ ++++ ++++ ++++
|
7.format rational:以分数的形式表示
1 2 3 4 5 6
| dat1 = 0 143788/37 35215/16 3531/25 1 133961/36 41961/19 17644/125 2 19331/5 35183/16 17923/127 3 77239/21 46183/21 565/4 4 40540/11 24241/11 11723/83
|
8.format hex:以16进制数表示
1 2 3 4 5 6 7 8 9 10 11 12 13
| dat1 = 列 1 至 3 0000000000000000 40ae5c52f1a9fbe7 40a131e04189374c 3ff0000000000000 40ad12472b020c4a 40a140f333333333 4000000000000000 40ae346666666666 40a12ddf3b645a1d 4008000000000000 40acbc189374bc6a 40a12e61cac08312 4010000000000000 40accae7ef9db22d 40a13773b645a1cb 列 4 4061a7ae147ae148 4061a4dd2f1a9fbe 4061a4083126e979 4061a80000000000 4061a7b645a1cac1
|
9.format long g:15位有效数
1 2 3 4 5 6 7 8 9 10 11 12 13
| dat1 = 列 1 至 2 0 3886.162 1 3721.139 2 3866.2 3 3678.048 4 3685.453 列 3 至 4 2200.938 141.24 2208.475 141.152 2198.936 141.126 2199.191 141.25 2203.726 141.241
|
10.format short g:5位有效数
1 2 3 4 5 6
| dat1 = 0 3886.2 2200.9 141.24 1 3721.1 2208.5 141.15 2 3866.2 2198.9 141.13 3 3678 2199.2 141.25 4 3685.5 2203.7 141.24
|
十.数据文件读取
1.text文件
1 2 3 4 5 6
| data1.txt: 0 3886.162 2200.938 141.240 1 3721.139 2208.475 141.152 2 3866.200 2198.936 141.126 3 3678.048 2199.191 141.250 4 3685.453 2203.726 141.241
|
1.dat1=load()
1 2 3 4 5 6 7 8
| dat1=load('data1.txt') dat1 = 1.0e+03 * 0 3.8862 2.2009 0.1412 0.0010 3.7211 2.2085 0.1412 0.0020 3.8662 2.1989 0.1411 0.0030 3.6780 2.1992 0.1412 0.0040 3.6855 2.2037 0.1412
|
2.dat2=importdata()
1 2 3 4 5 6 7 8 9 10 11
| dat2=importdata('data1.txt')
dat2 = 列 1 至 2 0 3886.162 1 3721.139 2 3866.2 3 3678.048 4 3685.453 列 3 至 4 2200.938 141.24
|
3.[a,b,c,d]=textread()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| [a,b,c,d]=textread('data1.txt','%2d %8.3f %8.3f %7.3f')
a = 0 1 2 3 4 b = 3886.162 3721.139 3866.2 3678.048 3685.453 c = 2200.938 2208.475 2198.936 2199.191 2203.726 d = 141.24 141.152 141.126 141.25 141.241
|
4.dat3=dat2(m:n,p:q)%提取矩阵的指定行和列组成的新矩阵
1 2 3 4
| dat2(1:2,1:2) ans = 0 3886.162 1 3721.139
|
2. excel文件
1.num=xlsread(文件名)
1 2 3 4 5
| num=xlsread('移动通知户开户数.xlsx') num = 1 57286 2 34096 …………………………………………
|
2.num=xlsread(文件名,shett号,范围1)
1 2 3 4 5
| num=xlsread('移动通知户开户数.xlsx','A2:A67') num = 1 2 ……
|
3.num=xlsread(文件名,sheet号)
1 2 3 4 5
| num=xlsread('移动通知户开户数.xlsx',1) num = 1 57286 2 34096 …………………………………………
|
4.[x,y]=xlsread(文件名,shett号,范围1)
1 2 3 4 5
| num=xlsread('移动通知户开户数.xlsx',1,'A2:A67') num = 1 2 ……
|
5.num=readtable(文件名)
得到的是table类型数据
1
| num=readtable('移动通知户开户数.xlsx')
|
1 2 3 4 5 6 7 8 9
| num = 731×2 table Var1 Var2 ____ _____ 1 57286 2 34096 3 26996 4 29552 5 27492
|
十一.函数kstest()
1. 语法
$H = kstest(X)$
$H = kstest(X,cdf)$
$H = kstest(X,cdf,alpha)$
$H=kstest(X,cdf,alpha,tail)$
$[H,P,KSSTAT,CV] = kstest(X,cdf,alpha)$
2. 描述
H = kstest(X) %测试向量X是否服从标准正态分布,测试水平为5%。
H = kstest(X,cdf) %指定累积分布函数为cdf的测试(cdf=[ ]时表示标准正态分布),测试水平为5%
H = kstest(X,cdf,alpha) % alpha为指定测试水平H=kstest(X,cdf,alpha,tail) % tail=0为双侧检验, tail=1单侧(<)检验, tail=-1单侧(>) 检验
[H,P,KSSTAT,CV] = kstest(X,cdf,alpha) %P为原假设成立的概率,KSSTAT为测试统计量的值,CV为是否接受假设的临界值。
3. 参数
3.1 输入参数
3.2 输出参数
4. 注意
kstest适用于小样本,当数据过大时,检验拒绝的临界值非常小,结果往往是拒绝原假设。
各种检验方法适用范围如下:
- chi2gof适合大样本,一般要求50个以上
- kstest适于小样本,
- lillietest用于正态分布,与kstest类似,适用于小样本
- jbtest,是通过峰度、偏度检测正态分布的,适用用大样本。
十二.函数crosstab()
1.句法
$tbl = crosstab(x1,x2)$
$tbl = crosstab(x1,…,xn)$
$[tbl,chi2,p] = crosstab()$
$[tbl,chi2,p,labels] = crosstab()$
2.描述
tbl = crosstab(x1,x2) %返回一个交叉列表,tbl具有相同长度的两个向量,的,x1和x2。
tbl = crosstab(x1,…,xn) %返回一个多维交叉列表,tbl,对于多个输入向量数据,x1,x2,…, xn。
[tbl,chi2,p] = crosstab() %对于在每个维度上独立的测试,还返回卡方统计量pchi2及其p值。您可以使用任何以前的语法。ptbl
[tbl,chi2,p,labels] = crosstab() %还返回一个单元格数组,labels其中每个输入参数x1… 都包含一列标签xn。
3.概念
频数(Frequency),又称“次数”。指变量值中代表某种特征的数(标志值)出现的次数;
4.参数
输入参数
- x1— 分组变量的输入向量
- x2— 分组变量的输入向量
- x1,…,xn— 输入向量
输出参数
- tbl— 整数值的交叉列表表(矩阵)
- chi2—卡方统计(正标量值)
- p— p -Value(标量值,范围内[0,1])
- labels—数据标签(单元格数组)
5.例
1.tbl = crosstab(x1,x2)
1 2 3 4 5 6 7 8 9 10
| x = [1 1 2 3 1]; y = [1 2 5 3 1]; tbl = crosstab(x,y)
tbl = 2 1 0 0 0 0 0 1 0 0 1 0
|
2.[tbl,chi2,p] = crosstab(x,y)
1 2 3 4 5 6 7 8 9
| [table,chi2,p] = crosstab(x,y) table = 2 1 0 0 0 0 0 1 0 0 1 0 chi2 = 10 p = 0.1247
|
十三.zscore函数 数据的标准化处理
1.简介
在数据分析之前,我们通常需要先将数据标准化(normalization),利用标准化后的数据进行数据分析。数据标准化也就是统计数据的指数化。数据标准化处理主要包括数据同趋化处理和无量纲化处理两个方面。数据同趋化处理主要解决不同性质数据问题,对不同性质指标直接加总不能正确反映不同作用力的综合结果,须先考虑改变逆指标数据性质,使所有指标对测评方案的作用力同趋化,再加总才能得出正确结果。数据无量纲化处理主要解决数据的可比性。数据标准化的方法有很多种,常用的有“最小—最大标准化”、“Z-score标准化”和“按小数定标标准化”等。经过上述标准化处理,原始数据均转换为无量纲化指标测评值,即各指标值都处于同一个数量级别上,可以进行综合测评分析。
2.z-score 标准化
这种方法基于原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。将A的原始值x使用z-score标准化到x’。
z-score标准化方法适用于属性A的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况。
3.计算公式
- 新数据=(原数据-均值)/标准差
用zscore函数可以把数据进行z-score标准化处理。
4.用法
$Y=zscore(X)$
x为标准化之前的数据,y为标准化后的数据
5.特点:
- 样本平均值为0,方差为1;
- 区间不确定,处理后各指标的最大值、最小值不相同;
- 对于指标值恒定的情况不适用;
- 对于要求标准化后数据 大于0 的评价方法(如几何加权平均法)不适用。
参考文章