统计学习方法之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 for(int j=start;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);
}
}

你可能感兴趣的:(统计学习方法)