统计机器学习导论第16章非参数估计——具有由可能性交叉检验选择的最近邻数目的NNDE

n=500; x=myrand(n); x2=x.^2;
ks=[10 50 100]; t=5; g=gamma(3/2);
d2=repmat(x2,[n 1])+repmat(x2',[1 n])-2*x'*x;
v=mod(randperm(n),t)+1;
for j=1:t
  S=sort(d2(v~=j,v==j));
  for i=1:length(ks)
    k=ks(i); r=sqrt(S(k+1,:));
    s(j,i)=mean(log(k*g./(sum(v~=j)*sqrt(pi)*r)));
  end
end
[dum,a]=max(mean(s)); k=ks(a);
m=1000; X=linspace(0,5,m); 
D2=repmat(X.^2,[n 1])+repmat(x2',[1 m])-2*x'*X;
S=sort(D2); r=sqrt(S(k+1,:))'; Ph=k*g./(n*sqrt(pi)*r);
figure(1); clf; plot(X,Ph,'r*'); k

function x=myrand(n)

x=zeros(1,n); u=rand(1,n);
t=(0<=u & u<1/8); x(t)=sqrt(8*u(t));
t=(1/8<=u & u<1/4); x(t)=2-sqrt(2-8*u(t));
t=(1/4<=u & u<1/2); x(t)=1+4*u(t);
t=(1/2<=u & u<3/4); x(t)=3+sqrt(4*u(t)-2);
t=(3/4<=u & u<=1); x(t)=5-sqrt(4-4*u(t));

当然,请看下面对每行代码的功能进行详细解释:

1. `n=500;`:将变量 `n` 的值设置为 500,表示数据点的数量。

2. `x=myrand(n);`:生成一个长度为 `n` 的随机数据点向量,并将其赋值给变量 `x`。

3. `x2=x.^2;`:计算数据点向量 `x` 的每个元素的平方,并将结果赋值给变量 `x2`。

4. `ks=[10 50 100];`:定义一个包含三个值的向量 `ks`,表示最近邻的数量。

5. `t=5;`:将变量 `t` 的值设置为 5,表示将数据点分为 5 个组。

6. `g=gamma(3/2);`:计算伽玛函数 `gamma(3/2)` 的值,并将结果赋值给变量 `g`。

7. `d2=repmat(x2,[n 1])+repmat(x2',[1 n])-2*x'*x;`:计算数据点之间的欧氏距离矩阵 `d2`。使用矩阵运算,先将 `x2` 和 `x2'` 进行扩展,并进行元素相加和矩阵乘法,得到距离矩阵 `d2`。

8. `v=mod(randperm(n),t)+1;`:生成一个长度为 `n` 的向量 `v`,其中的元素值为 1 到 `t` 的循环序列。使用 `randperm(n)` 生成随机排列的向量,然后进行取余运算,并加1,得到向量 `v`。

9. `for j=1:t`:开始一个循环,循环变量 `j` 取值从 1 到 `t`。

10. `S=sort(d2(v~=j,v==j));`:从距离矩阵 `d2` 中选择子集,其中条件 `v~=j` 和 `v==j` 分别用于选择第 `j` 组和其他组的数据点。对所选子集进行排序,并将结果赋值给变量 `S`。

11. `for i=1:length(ks)`:开始一个嵌套循环,循环变量 `i` 取值从 1 到 `ks` 的长度。

12. `k=ks(i);`:取出 `ks(i)` 的值作为最近邻的数量 `k`。

13. `r=sqrt(S(k+1,:));`:根据选择的最近邻距离的索引 `k`,计算距离的平方根,并将结果赋值给变量 `r`。

14. `s(j,i)=mean(log(k*g./(sum(v~=j)*sqrt(pi)*r)));`:计算密度估计,并将结果存储在矩阵 `s` 的第 `j` 行、第 `i` 列的位置。这里使用公式计算密度估

计。

15. `end`:结束内层循环。

16. `end`:结束外层循环。

17. `[dum,a]=max(mean(s)); k=ks(a);`:选择具有最大均值的密度估计值,并将其对应的索引赋值给变量 `a`。然后根据索引 `a` 选择最佳的最近邻数量 `k`。

18. `m=1000;`:将变量 `m` 的值设置为 1000,表示生成测试点的数量。

19. `X=linspace(0,5,m);`:生成一个从 05 的等距离划分的向量 `X`,包含 `m` 个点。

20. `D2=repmat(X.^2,[n 1])+repmat(x2',[1 m])-2*x'*X;`:计算测试点与数据点之间的欧氏距离矩阵 `D2`。使用矩阵运算,先将 `X.^2` 和 `x2'` 进行扩展,并进行元素相加和矩阵乘法,得到距离矩阵 `D2`。

21. `S=sort(D2);`:对距离矩阵 `D2` 进行排序,并将结果赋值给变量 `S`。

22. `r=sqrt(S(k+1,:))';`:根据选择的最近邻距离的索引 `k`,计算距离的平方根,并将结果赋值给变量 `r`。

23. `Ph=k*g./(n*sqrt(pi)*r);`:计算最终的密度估计值 `Ph`。根据公式计算密度估计值。

24. `figure(1); clf;`:创建图形窗口编号为 1,并清除当前图形窗口中的所有内容。

25. `plot(X,Ph,'r*');`:在图形窗口中绘制红色星形的密度估计曲线。横坐标为 `X`,纵坐标为 `Ph`。

26. `k`:输出最佳的最近邻数量 `k`。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值