本章结构:
L p ( x i , x j ) = ∑ l = 1 n ∣ x i ( l ) − x j ( l ) ∣ p 1 p , 这 里 p ≥ 1 当 p = 2 时 , 称 为 欧 氏 距 离 。 当 p = 1 时 , 称 为 曼 哈 顿 距 离 , 即 L 1 ( x i , x j ) = ∑ l = 1 n ∣ x i ( l ) − x j ( l ) ∣ 当 p = ∞ 时 , 他 是 各 个 坐 标 距 离 的 最 大 值 , 即 L ∞ ( x i , x j ) = max l ∣ x i ( l ) − x j ( l ) ∣ L_p(x_i,x_j)=\sqrt[{\frac{1}{p}}]{\sum _{l=1}^n \mid x_i^{(l)}-x_j^{(l)}\mid ^p},这里p\geq 1\\ 当p=2时,称为欧氏距离。\\ 当p=1时,称为曼哈顿距离,即L_1(x_i,x_j)=\sum _{l=1}^n\mid x_i^{(l)}-x_j^{(l)}\mid \\ 当p=\infty时,他是各个坐标距离的最大值,即L_{\infty}(x_i,x_j)=\max _l\mid x_i^{(l)}-x_j^{(l)}\mid \\ Lp(xi,xj)=p1l=1∑n∣xi(l)−xj(l)∣p,这里p≥1当p=2时,称为欧氏距离。当p=1时,称为曼哈顿距离,即L1(xi,xj)=l=1∑n∣xi(l)−xj(l)∣当p=∞时,他是各个坐标距离的最大值,即L∞(xi,xj)=lmax∣xi(l)−xj(l)∣
对于数据集 T = { x 1 , x 2 , . . . , x n } T=\{x_1,x_2,...,x_n\} T={x1,x2,...,xn},其中 x i = ( x i ( 1 ) , x i ( 2 ) , . . . , x i ( n ) ) T , i = 1 , 2 , . . . , N ; x_i=(x_i^{(1)},x_i^{(2)},...,x_i^{(n)})^T,i=1,2,...,N; xi=(xi(1),xi(2),...,xi(n))T,i=1,2,...,N;
构造方法(平衡 k d kd kd树,注意,平衡 k d kd kd树搜索时效率未必是最优的)
例3.2
import numpy as np
T = np.array([[2, 3], [5, 4], [9, 6], [4, 7], [8, 1], [7, 2]])
n = T.shape[0]
k = T.shape[1]
class Node(object):
"""
节点类,用于创建二叉树
"""
def __init__(self, item=None):
self.elem = item
self.l_child = None
self.r_child = None
def traversal(node, mes):
"""
二叉树遍历
:param node: 根节点
:param mes: 节点信息
:return: None
"""
if node is None:
print('none')
return
print(node.elem, mes)
traversal(node.l_child, 'l')
traversal(node.r_child, 'r')
def build_kd_tree(_node, _depth, m_set):
"""
创建二叉树
:param _node: 待插入node节点
:param _depth: 该node深度
:param m_set: 待选定数据坐标集合
:return: None
"""
global k
if len(m_set) == 0:
return
cut_dim = _depth % k
len_set = len(m_set)
mid = len_set // 2
m_sort_set = sorted(m_set, key=lambda x: x[cut_dim])
# print(m_sort_set)
point = m_sort_set[mid]
# print('choose: ', point)
_node.elem = point
# print(_node.elem)
l_set = []
r_set = []
for _i in range(0, mid):
l_set.append(m_sort_set[_i])
for _i in range(mid + 1, len(m_set)):
r_set.append(m_sort_set[_i])
if len(l_set) is not 0:
_node.l_child = Node()
build_kd_tree(_node.l_child, _depth + 1, l_set)
if len(r_set) is not 0:
_node.r_child = Node()
build_kd_tree(_node.r_child, _depth + 1, r_set)
def main():
"""
主函数
:return: None
"""
kd_node = Node()
build_kd_tree(kd_node, 0, T)
traversal(kd_node, 'root')
if __name__ == '__main__':
main()
[7 2] root
[5 4] l
[2 3] l
none
none
[4 7] r
none
none
[9 6] r
[8 1] l
none
none
none
以上图片来自:————————————————
版权声明:本文为CSDN博主「cnblogs.com/qizhou/」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37189298/article/details/104164718