用matlab的var函数求方差

用matlab的var函数求方差,第1张

什么是方差标准差

方差(variance) 和标准差(standard variance)

方差:表示一组离散数据偏离平均值的程度。

公式:

方差公式

方差的算术平方根称为该随机变量的 标准差 。

在Matlab中, 方差 用 var函数 求, 标准差 用 std函数 来求。

以下转自: Matlab方差用std 或var 求出的结果和公式算出来的不一样 – MATLAB中文论坛

和 MATLAB求方差函数 var – MATLAB中文论坛

请问如何用matlab求一组数据的均方误差,方差,用std 或var 求出的结果和公式算出来的不一样?

最近做的东西要对两个样本的可区分度进行度量。懒得去用那些复杂的东西,自己就想用两样本的均值差除以两样本的方差的和。

查了下 MATLAB中var是用来计算样本方差的。

但是发现好像有些错误

比如,输入样本a=[1 2 3];如果按照方差求解方法,a的方差应该是(1+0+1)/3=0666666……才对。使用var(a),结果MATLAB输出的结果却是1。Why

答案:

1出现此种情况的原因 :

方差的公式是:实际值与期望值之差的平方和再除以N。

这个公式是针对度量总体(population)的,而matlab的函数var和std认为 *** 作数是度量总体的一个样本(sample),所以使用的公式为实际值与期望值之差的平方和再除以(N-1)而不是N。

具体使用哪个定义,应该具体问题具体分析了。

2 解决方法 :

>> var(a,1)  %除数为N

ans =06667

>> var(a,0)%除数为N-1,该式等价于var(a),二者都是除以N-1

ans=1

1、std函数是用来计算标准偏差的一个函数,由于其有不同的参数,我们就用下面的例子进行介绍:

A =

1 2 3

1 1 1

2、std(A):

std(A)函数求解的是最常见的标准差,此时除以的是N-1。

注意:此函数命令不能对矩阵求整体的标准差,只能按照行或者列进行逐个求解标准差,默认情况下是按照列。

在MATLAB主窗口中输入std(A) 回车,结果如下:

输出的是每一列的标准差。

3、std(A,flag):

这里flag代表的是用哪一个标准差函数,如果取0,则代表除以N-1,如果是1代表的是除以N,在MATLAB主窗口中输入std(A,1) 回车,std(A,0) 回车,可以看到如下结果

4、std(A,flag,dim):

第三个参数代表的是按照列求标准差还是按照行求标准差,std(A,1,1)代表的是按照列求标准差,std(A,1,2)代表的是按照行求标准差。

在MATLAB主窗口中输入如下命令:std(A,1,1) 敲回车 std(A,1,2) 敲回车。

1,[muhat,sigmahat,muci,sigmaci] = normfit(x),其中sigmahat不应该是标准差吗?(是的)为何有些的方说是方差?(不严格)

2,还有就是normfit估计出来的均值会不会总是在ttest算出的置信区间里(两种方式计算结果很接近)

文件名为tempxls,放在matlab库里,否则写全路径

标准差存在了res里,有两列,第一列,为A列代码的值,B列为A列对应所有值的标准差,公式中,为n,不为n-1

A=xlsread('tempxls');

x=unique(A(:,1));

n=length(x);

res=zeros(n,2);

res(:,1)=x;

for i =1:n

k = A(:,1)==x(i);

res(i,2)=std(A(logical(k),2));

end

这个是Help中的解释,我大概做下翻译:

s = std(X)

s = std(X,flag)

s = std(X,flag,dim)

有三个std函数,都是返回标准差的计算函数

有两个计算式(如中显示)两个计算等式只在除以n或者n-1的差别(The two forms of the equation differ only in  versus  in the divisor)

(1)s=std(x),返回向量(数组)的标准差,用计算等式(1)式计算,当x为矩阵时,可得单行的标准差

(2)s=std(x,flag),flag作为标记值,有1或者0两个取值,当flag取值为0时,用计算式(1)即等于直接使用std(x),当flag取值为1时,使用计算式(2)

(3)s=std(x,flag,dim),flag的作用如(2)中所说,dim标示x的次元

假如   x=[1,2,3

     4,5,6

     7,8,9]

 s=std(x,1,1)

s =

    24495    24495    24495

>>  s=std(x,1,2)

s =

    08165

    08165

    08165

这个你具体打开help,分别搜var和std函数就行了,help里边说的很明白很详细,一看就懂。

我这里稍微做一下解释:

v1=var(x)

V = var(X) returns the variance of X for vectors

v2=var(x,0)

var(X,0) is equivalent to var(X)

v3=var(x,1)

V = var(X,1) normalizes by N and produces the second moment of the sample about its mean

v4=var(x,w)

V = var(X,w) computes the variance using the weight vector w

v5=var(x,1,1)

V = var(X,w,dim) takes the variance along the dimension dim of X

s1=std(x)

s = std(X), where X is a vector, returns the standard deviation using (1) above

(std可以使用不同的式子求,求出来不等价,看具体情况选择,这里的(1)是help里边的一个公式)

s2=std(x,1)

s = std(X,flag) for flag = 0, is the same as std(X) For flag = 1, std(X,1) returns the standard deviation using (2) above, producing the second moment of the set of values about their mean

s3=std(x,w)

s = std(X,flag,dim) computes the standard deviations along the dimension of X specified by scalar dim Set flag to 0 to normalize Y by n-1; set flag to 1 to normalize by n

这里只是大体粘贴了一下,公式在help里边也有,你还是自己help一下哈~

那你就把A变成一列不就完了吗

std(A(:),flag)

如果flag=0,就是无偏标准差,就是除以n-1的,如果flag=1就是除以n的,是有偏的

过两点求直线方程这是初中的公式吧,不会连这都要说吧,实在不行直接polyfit也行啊。

A=[1,2];B=[3,4];

p=polyfit([A(1),B(1)],[A(2),B(2)],1);%y=p(1)x+p(2)

plot([A(1),B(1)],[A(2),B(2)],'ro');

hold on;ezplot(@(x)p(1)x+p(2))

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/11678788.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存