用matlab编写一个高斯核密度函数
来源:学生作业帮 编辑:搜搜考试网作业帮 分类:综合作业 时间:2024/07/11 09:41:51
用matlab编写一个高斯核密度函数
![](http://img.wesiedu.com/upload/d/3d/d3dde0e1ebf964ed92ec865bca8c45b5.jpg)
上面是高斯核密度函数的形式,h为窗宽,x1,x2,.xn是样本的点,用matlab编写的程序如下:
function c=yanyan(x,y,z)
n=length(y)
zz=vectorize(sum(exp(-(x-y)^2)/(2*z^2)))
yux=n*z*(2*pi)^0.5
c=zz/yux
end
x----未知数
y----x1,x2.xn这个向量
z-----窗宽
zz是指
这些相加
yux是指
![](http://img.wesiedu.com/upload/c/94/c94ecbac4096e2a86f5376108ea32fc4.jpg)
,但是matlab现实too many input,
![](http://img.wesiedu.com/upload/d/3d/d3dde0e1ebf964ed92ec865bca8c45b5.jpg)
上面是高斯核密度函数的形式,h为窗宽,x1,x2,.xn是样本的点,用matlab编写的程序如下:
function c=yanyan(x,y,z)
n=length(y)
zz=vectorize(sum(exp(-(x-y)^2)/(2*z^2)))
yux=n*z*(2*pi)^0.5
c=zz/yux
end
x----未知数
y----x1,x2.xn这个向量
z-----窗宽
zz是指
![](http://img.wesiedu.com/upload/a/2d/a2df4578ae4a290bdcbb6b3172cac7a5.jpg)
yux是指
![](http://img.wesiedu.com/upload/c/94/c94ecbac4096e2a86f5376108ea32fc4.jpg)
,但是matlab现实too many input,
![用matlab编写一个高斯核密度函数](/uploads/image/z/7829205-69-5.jpg?t=%E7%94%A8matlab%E7%BC%96%E5%86%99%E4%B8%80%E4%B8%AA%E9%AB%98%E6%96%AF%E6%A0%B8%E5%AF%86%E5%BA%A6%E5%87%BD%E6%95%B0)
1、你是怎样调用的?照理说,如果是正常的调用,例如
yanyan(1.5,1:10,.1)
应该会出现Matrix must be square的提示,而不会是too many input.
2、vectorize不是这样用的,它只能把一个char类型的表达式或sym、inline对象给替换成点运算,而对于一个double类型的数值,会强制转换为char类型,可能导致丢失精度(因为char的表示范围有限,即使在中文环境下,范围也只是0-65535,而且只能是整数).
3、表达式写错了,把2h^2给放到指数函数外面了,也就是说
exp(-(x-y)^2)/(2*z^2)
应为
exp(-(x-y)^2/(2*z^2))
4、可以简单修改如下:
function c=yanyan(x,y,z)
n=length(y);
zz=sum(exp(-(x-y).^2/(2*z^2)));
yux=n*z*(2*pi)^0.5;
c=zz/yux;
但这样的写法不支持x为向量的情况,可以考虑改成
function c=yanyan(x,y,z)
n=length(y);
yux=n*z*(2*pi)^0.5;
c=arrayfun(@(x)sum(exp(-(x-y).^2/(2*z^2))),x)/yux;
yanyan(1.5,1:10,.1)
应该会出现Matrix must be square的提示,而不会是too many input.
2、vectorize不是这样用的,它只能把一个char类型的表达式或sym、inline对象给替换成点运算,而对于一个double类型的数值,会强制转换为char类型,可能导致丢失精度(因为char的表示范围有限,即使在中文环境下,范围也只是0-65535,而且只能是整数).
3、表达式写错了,把2h^2给放到指数函数外面了,也就是说
exp(-(x-y)^2)/(2*z^2)
应为
exp(-(x-y)^2/(2*z^2))
4、可以简单修改如下:
function c=yanyan(x,y,z)
n=length(y);
zz=sum(exp(-(x-y).^2/(2*z^2)));
yux=n*z*(2*pi)^0.5;
c=zz/yux;
但这样的写法不支持x为向量的情况,可以考虑改成
function c=yanyan(x,y,z)
n=length(y);
yux=n*z*(2*pi)^0.5;
c=arrayfun(@(x)sum(exp(-(x-y).^2/(2*z^2))),x)/yux;