✏️
LiHang-TongJiXueXiFangFa
  • Introduction
  • 第2章 感知机 - 原始形式
    • 学习策略的推导
    • 梯度下降法的算法过程
    • 梯度下降法的推导过程
    • 梯度下降法的收敛证明
  • 第2章 感知机 - 对偶形式
    • 学习模型的推导
    • 梯度下降法的算法过程
    • 梯度下降法的推导过程
  • 第3章 k近邻算法
    • 模型三要素
    • 构造平衡kd树
    • 用kd树的k近邻搜索
    • kd树的原理与改进
  • 第4章 朴素贝叶斯
    • 模型公式的推导
    • 策略公式的推导
    • 最大似然估计算法过程
    • 贝叶斯估计算法过程
  • 第5章 决策树
    • 决策树的模型
    • 信息增益的算法
    • ID3决策树的生成算法
    • C4.5决策树的生成算法
    • 决策树的剪枝算法
  • 第5章 CART决策树
    • CART树的生成
    • CART树的剪枝
  • 第6章 逻辑回归
    • 二分类逻辑回归模型
    • 多分类逻辑回归模型
  • 第6章 最大熵模型
    • 最大熵的原理
    • 最大熵模型的定义
    • 最大熵的学习过程
    • 根据最大熵的学习过程推导最大熵模型
    • 证明:对偶函数的极大化=模型的极大似然估计
  • 第6章 目标函数最优化问题
    • 改进的迭代尺度法(IIS)
    • IIS算法公式(1)推导
    • A和B的推导
    • 拟牛顿法
  • 第7章 支持向量机
    • 函数间隔与几何间隔
  • 第7章 线性可分SVM
    • 凸二次规划问题推导
    • 支持向量
    • 凸二次规划问题求解
    • 原始问题转换为对偶最优化问题
  • 第7章 线性SVM
    • 原始问题转换为对偶最优化问题
    • 根据 a 求 w 和 b*
    • 支持向量
  • 第7章 非线性SVM
    • 核函数与核技巧
    • 核技巧在SVM中的应用
    • 7.3.2 正定核
    • 常用的核函数
  • 第7章 序列最小最优化算法
    • 选择变量
    • 推导1
    • 推导2
    • 推导3
    • 推导4
    • 推导5:update b
  • 第8章 adaboost
    • 算法过程
    • 训练误差分析
    • 加法模型
    • 前向分步算法
    • adaboost一种特殊的加法模型
  • 第8章 提升树
    • 回归问题提升树的推导
    • 回归问题提升树前向分步算法
    • 一般决策问题梯度提升算法
  • 第9章 EM算法
    • 算法过程
    • Q函数的推导
    • 关于算法的收敛性
    • 高斯混合模型参数估计的EM算法
    • Q函数推导
    • 推导2
  • 第10章 隐马尔可夫模型
    • 定义
    • 概率计算问题 - 直接计算法
    • 概率计算问题 - 前向算法
    • 概率计算问题 - 后向算法
    • 学习问题 - 监督学习
    • 学习问题 - 非监督学习
    • Baum - Welch算法推导
    • 推导1
    • 预测问题 - 近似算法
    • 预测问题 - 维特比算法
    • 维特比算法推导过程
  • 第11章 条件随机场
    • 概率无向图模型
  • 遗留问题
Powered by GitBook
On this page

Was this helpful?

  1. 第3章 k近邻算法

用kd树的k近邻搜索

输出: 已构造的kd树 目标点x

输出: x的最近邻

在kd树中找出包含目标点x的叶结点:从根结点出发,递归地向下访问kd树。若目标点x当前维的坐标小于切分点的坐标,则移动到左子节点,否则移动到右子节点。直至子结点为叶结点为止。 以此结点为当前最近点 递归地向上回退,在每个结点进行以下操作: a) 如果该结点保存的实例点比当前最近点距离目标点更近,则以该实例点为“当前最近点”。 b) 当前最近点一定存在于该结点一个子结点对应的区域。检查该子结点的父结点的另一个子结点对应的区域是否有更近的点。具体地,检查另一个子结点对应的区域是否以目标点为球心、以目标点与“当前最近点”间的距离为半径的超球体相交。如果相交,可能在另一个子结点对应的区域内存在距目标点更近的点,移动到另一个子结点。接着,递归的进行最近邻搜索。如果不相交,向上回退。 当回退到根结点时搜索结束。最后的“当前最近点”即为x的最近邻点。

代码:

def isLeaf(node):
    return True

# 在kd树中找出包含目标点x的叶结点
def findLeaf(node, depth, x):
    # 从根结点出发,递归地向下访问kd树
    while True:
        feature = node['feature']
        # 若目标点x当前维的坐标小于切分点的坐标
        if x[feature] < node['data'][feature]:
            # 则移动到左子节点
            subnode = node['left']
        # 否则移动到右子节点
        else:
            subnode = node['right']
        # 直至子结点为叶结点为止
        if subnode['data'].shape[0] == 0:
            return node
        node = subnode

def distance(A, B):
    return np.linalg.norm(A - B)

def check(feature, value, x):
    return np.abs(x[feature] - value[feature])

def isSame(a, b):
    return a[0] == b[0] and a[1] == b[1]

def findAnother(node):
    parent = node['parent']
    if isSame(node['data'], parent['left']['data']):
        return parent['right']
    else:
        return parent['left']

def search(root, x):
    # 在kd树中找出包含目标点x的叶结点
    current = findLeaf(root, 0, x)
    # 以此结点为当前最近点
    nearest = current['data']
    currentDistance = distance(nearest, x)
    # 递归地向上回退,在每个结点进行以下操作
    # 当回退到根结点时搜索结束
    while not isSame(current['data'], root['data']):
        parent = current['parent']
        dis = distance(parent['data'], x)
        # 如果该结点保存的实例点比当前最近点距离目标点更近
        if dis < currentDistance:
            # 则以该实例点为“当前最近点”
            nearest = parent['data']
            currentDistance = dis
        # 检查该子结点的父结点的另一个子结点对应的区域是否有更近的点
        # 即目标结点到平面feature=value的距离
        # 如果相交,可能在另一个子结点对应的区域内存在距目标点更近的点
        if check(parent['feature'], parent['data'], x) < currentDistance:
            # 递归的进行最近邻搜索
            newnode, dis = search(findAnother(current), x)
            if dis < currentDistance:
                nearest = newnode
                currentDistance = dis
        current = parent  
    return nearest, currentDistance
Previous构造平衡kd树Nextkd树的原理与改进

Last updated 5 years ago

Was this helpful?