可以这样,假设你已经有了一组数据是a,我这自己产生啦~
a=randn([10000,1]);
ksdensity(a);
这样就可以得到它的概率密度函数了~
当然这个函数也可以有输出,具体的你可以help一下~
计算样本向量x的概率密度估计,返回在xi点的概率密度f,此时我们使用plot(xi,f)就可以绘制出概率密度曲线。
在matlab中有一组数据,要得到这组数据的概率密度分布,要注意连续随机变量概率密度函数与离散随机变量概率分布函数的区别。该函数,首先统计样本x在各个区间的概率(与hist有些相似),再自动选择xi,计算对应的xi点的概率密度。ksdensity这个函数画的是连续随机变量的概率密度函数,而连续随机变量的概率密度函数是可以大于1的。特别是值都是小于1的,那概率密度更可能是大于1的了,因为概率密度函数的积分等于1,横坐标小于1,纵坐标当然很可能大于1!而如果要得到小于1的概率分布,那实际上是离散的概率分布,离散随机变量实际上是没有概率密度函数的(当然你也可以说某些形式下有),只有概率分布函数。可以通过以下程序得到:
sApProMax=max(sApPro);
sApProMin=min(sApPro);
meanS=mean(sApPro);
x=linspace(sApProMin,sApProMax,20000+1);
yy=hist(sApPro,x); %计算各个区间的个数
yy=yy/length(sApPro); %计算各个区间的比例
bar(x,yy);
以估计正态分布为例,
高斯核函数:
核函数估计方法:
clear alln=100;
%生成一些正态分布的随机数
x=normrnd(0,1,1,n);
minx = min(x);
maxx = max(x);
dx = (maxx-minx)/n;
x1 = minx:dx:maxx-dx;
h=05;
f=zeros(1,n);
for j = 1:n
for i=1:n
f(j)=f(j)+exp(-(x1(j)-x(i))^2/2/h^2)/sqrt(2pi);
end
f(j)=f(j)/n/h;
end
plot(x1,f);
%用系统函数计算比较
[f2,x2] = ksdensity(x);
hold on;
plot(x2,f2,'r'); %红色为参考
%绘制二元频数直方图
% 调用ksdensity函数分别计算原始样本X和Y处的核分布估计值
U = ksdensity(X,X,'function','cdf');
V = ksdensity(Y,Y,'function','cdf');
figure; % 新建一个图形窗口
% 绘制边缘分布的二元频数直方图,
hist3([U(:) V(:)],[30,30])
函数pdf 及其整个家族都可以用来计算,你可以help一下。最简单的就是用ksdensity:
比如:
[f, x] = ksdensity(randn(100000, 1));
plot(x, f)
实例程序,应对普通情况应该够了,但是有些特殊情况不合适,不过大多数情况不必要求非常准确,如果要很准确,自行修改下。
% 数据
ydata = random('Normal',0,1,1,1024);
% 准备一些变量
bins = 100; %分100个区间进行统计
maxdat = max(ydata);%最大值
mindat = min(ydata);%最小值
bin_space = (maxdat - mindat) / bins;%每个bin宽度
xtick = mindat : bin_space : maxdat - bin_space;
% 求pdf
distribution = hist(ydata,bins);%使用直方图得到数据落在各区间的总数
pdf = bins distribution / ((sum(distribution )) (maxdat - mindat));%计算pdf
% 画图
figure;
plot(xtick,pdf);
% 验证:sum(pdf) bin_space应该接近1
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)