统计学习方法之k近邻法:kd树

k近邻就像近朱者赤近墨者黑一样,李航老师的《统计学习方法》中k近邻模型由距离度量、k值的选择和分类决策规则决定。个人觉得就很像判断一个人的性格,先选定一个他的交际范围(即k值),然后计算周围人和他的亲密关系(即距离度量),最后根据某个决策规则判断他的性格(分类决策规则)。

简单实现一下书中例题的平衡kd树构造

public class Tree_node {
//节点值
public int[] nodeVal={0};
//左右节点
public Tree_node left=null;
public Tree_node right=null;

Tree_node(int[] newData) {  
left = null;  
right = null;  
        nodeVal = newData;  
    } 

}

public class Kd_tree {
//树的深度deep;
static int deep=0;
//获得kd树
public static  Tree_node getNode(int[][]T,int start,int end,int deep,Tree_node parent,boolean isLeft){
int[]node=null;
//获得切分坐标轴
int k=deep%2+1;
int midIndex=(int)Math.ceil((start+end)/2.0);
//根据切分坐标轴排序
T=sort(T,start,end,k);
node=T[midIndex];
System.out.println(node[0]+","+node[1]);
//添加左右结点
Tree_node tree_node=new Tree_node(node);
if(parent!=null){
if(isLeft)
parent.left=tree_node;
else
parent.right=tree_node;
}
deep++;
if(start<=midIndex-1){
getNode(T,start,midIndex-1,deep,tree_node,true);
}
if(midIndex+1<=end){
getNode(T,midIndex+1,end,deep,tree_node,false);
}
return tree_node;
}
//简单排序
public static int[][] sort(int[][]T,int start,int end,int k){
for(int i=start;i<end;i++){
for(int j=start;j<end;j++){
if(T[j][k-1]>T[j+1][k-1]){
int[]temp=T[j];
T[j]=T[j+1];
T[j+1]=temp;
}
}
}
return T;
}
public static void main(String[] args) {
//二维空间数据集
int [][]T={{2,3},{5,4},{9,6},{4,7},{8,1},{7,2}};
//获得kd树
Tree_node kdTree=getNode(T,0,5,deep,null,true);
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值