kd树

pip下载指令(换个中国开源网站)pip install sklearn -i https://pypi.tuna.tsinghua.edu.cn/simple/

感知机(线性回归)

感知机训练集线性不可分是,感知机学习算法不收敛,迭代结果会发生震荡。

  k近邻模型

已知特征空间被划分为两个或多个子空间,对新的输入依据近邻原则划分到子空间的某一空间内。

划分原则:距离、k值选择、分类决策规则。

k值选择:二维空间中,次数选择不同,距离范围不同,k越大,容纳范围越大。k值过小,容易过拟合。

                一般用交叉验证法选取最优k值。

k近邻法的实现:kd树

实现k近邻法时,主要考虑的问题时如何对训练数据进行快递k近邻搜索。线性扫描计算耗时,为了提高k近邻搜索的效率,考虑使用特殊记过存储训练数据,以减少计算距离次数,如kd树法。

kd树是一种二叉树,表示对k维空间的一个划分,

空间k近邻划分(曼哈顿距离)
arr=np.array([2,3,5,4,9,6,4,7,8,10,7,2,9,2])
color=['#FF1493','#0000FF','#A52A2A','#FFD700','#00FF00','#000080','#FF0000']
arr=arr.reshape(7,2)
x=arr[:,0]
y=arr[:,1]
dis=np.empty([7],dtype=int,order='c')
plt.xlabel('x')
plt.ylabel('y')
plt.xlim(left=0,right=30)
plt.ylim(bottom=0,top=30)
for i in range(1,30):
    for j in range(1,30):
        for t in range(0,7):
            dis[t]=abs(i-arr[t,0])+abs(j-arr[t,1])   #改距离度量,欧氏距离...
        min_index=np.argmin(dis)   #数组最值索引
        area=np.pi*5*5
        plt.scatter(i,j,s=area,c=color[min_index],alpha=0.5)
       # print(min_index)
plt.show()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

### KD的概念 KD(K-d Tree),即K维,是一种用于组织点在k维空间中的状数据结构,主要用于多维空间中的快速搜索操作,如最近邻搜索和范围搜索。每个节点代表一个k维空间中的点,并且每个节点将空间划分为两个子空间,使得的左子中的所有点位于该节点的分割超平面的一侧,而右子中的点位于另一侧。这种分割方式确保了每个节点的子节点所在的区域是父节点区域的一个子集。 ### KD的原理 构建KD的过程是从给定的数据集中选择一个维度,并根据该维度上的中位数来分割数据集。这样做的目的是为了保持的平衡。接着,递归地对分割后的两个子集进行同样的操作,直到所有的数据都被插入到中。选择维度的方式可以是循环选择不同的维度,也可以基于某种启发式方法来决定最优分割维度。 在查询时,KD允许快速定位到接近查询点的数据点。当执行最近邻搜索时,从根节点开始,根据查询点在当前节点维度上的值决定进入左子还是右子。一旦到达叶子节点,就回溯并检查其他分支是否可能包含更近的邻居。这个过程涉及到计算查询点到超平面的距离,并判断是否有必要进入另一个分支进行搜索。 ### KD的实现 实现KD的关键在于如何有效地构建以及如何高效地执行搜索操作。以下是构建KD的基本步骤: 1. 选择一个维度作为分割维度。 2. 找到该维度上的中位数点。 3. 将中位数点作为当前节点,并将剩余的点分为两组,一组位于中位数点的一侧,另一组位于另一侧。 4. 对左右两组分别递归执行上述步骤。 以下是一个简单的Python伪代码示例,展示如何构建一个KD: ```python class Node: def __init__(self, point, left=None, right=None): self.point = point self.left = left self.right = right def build_kd_tree(points, depth=0): if not points: return None # 选择维度 k = len(points[0]) axis = depth % k # 按照当前维度排序并找到中位数 points.sort(key=lambda x: x[axis]) median = len(points) // 2 # 构建节点 return Node( point=points[median], left=build_kd_tree(points[:median], depth + 1), right=build_kd_tree(points[median + 1:], depth + 1) ) ``` 对于搜索算法,特别是最近邻搜索,实现起来更为复杂,因为需要考虑回溯过程以确保找到全局最近的邻居。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值