使用kd-tree加速k-means

0.目录

  • 前置知识
  • 思路介绍
  • 详述
    • 1 确定h的中心点
    • 2 算法步骤
  • java实现

1.前置知识

本文内容基于《Accelerating exact k-means algorithms with geometric reasoning
KDTree
k-means

2.思路介绍

k-means算法在初始化中心点后C通过以下迭代步骤得到局部最优解:

a.将数据集D中的点x赋给距离最近的中心点

b.在每个聚类中,重新计算中心点

传统算法中,a步需要计算n*k个距离(n为D的大小,k为聚类个数),b步需要相加n个数据点

而在KDTree中,每个非叶子节点,都存储了其包含的数据的数据范围信息h。

二维空间中的h可以使用矩形来表示
图中*为点,红色矩形为数据范围h 

a.
如果通过范围信息,能判断节点中数据都属于中心点c,则能省去节点中数据到中心点距离的计算

如果能判断h中数据都不属于某中心点c,则能省去节点中数据到中心点c距离的计算

b.
当知道节点中数据全部属于c,能将h中事先加好的统计量直接加到c的统计量中

3.详述

3.1
确定h的中心点(h中所有数据都离这个中心点近而离其他中心点远)

KDTree的节点中存储的Max(各维度上的最大值)和Min(各维度上的最小值)确定了节点中数据的范围

中心点有(c1,c2,...,ck)

a.
判断是否可能存在

计算各中心点到h的最小距离(参考KDTree最近邻查找,第5步) d(ci,h)

如果存在一个最小距离,则这个ci可能是h的中心点(还需要进一步判断)

若存在不止一个最小距离,则h的中心点不存在,需要将h分割为更小(在h的左右树上)后查找

正方形表示的点都在h的内部
所以他们到h的最小距离相同,都为0
此h不存在中心点     

b.
进一步判断,ci是否为中心点

L12为c1和c2连线的中位线,h全部落在c1一边,

所以h中的全部点离c1比离c2近,称c1优于c2

而对于c1和c3来说,h有一部分落在c1,有一部分落在c3

c1不优于c3

判断c1是否优于c3:

取向量v=(c3-c1),找到点p属于h,使<v,p>内积最大

v各维度正负情况(+,-),则p在x轴上尽可能大,y轴上尽可能小,取到p13

p13离c3近,所以c1不优于c3

如果ci在优于其他点,则可以判定ci即为h的中心点;否则ci不是h的中心点;
  虽然ci不是h的中心点,但是得到的信息,如ci优于c2,能将c2从h的子树的中心点候选列表中排除

3.2
算法步骤

KDTree中每个非叶子节点特殊属性:
sumOfPoints:m维向量(m是数据的维度),其i维度的值为节点中数据第i维的和
n:节点中数据的个数
输入:KDTree,C 包括中心点(c1,c2,...,ck)
输出:CNEW 新的k个中心点
node=KDTree.root
centers=k*m的数组//每行存储属于这个中心点的数据的和
datacount=k*1的数组//存储属于这个中心点的数据个数
UPDATE(node,C):
IF node为叶子节点
  遍历计算得到离node最近的节点ct
  centers[t]+=node.value;
  datacount[t]+=1;
  RETURN;

FOR(ci in C)  计算d(ci,node.h)
IF 有多个最小的d(ci,node.h)
  UPDATE(node.left,C);
  UPDATE(node.right,C);
  RETURN;
//假设d(ci,node.h)最小的是ct
CTOVER=[]//存储劣于ct的
FOR(ci in C(除了ct))  IF(ct 优于 ci) CTOVER.ADD(ci)
IF(LEN(CTOVER)=LEN(C)-1)//ct优于其他的中心点
  centers[t]+=node.sumOfPoints;
  datacount[t]+=node.n;
  RETURN;
CT=(ci in C 且 ci not in CTOVER)//排除比ct差的中心点
UPDATE(node.left,CT);
UPDATE(node.right,CT);
RETURN;

4.java实现

时间: 2024-10-11 09:55:47

使用kd-tree加速k-means的相关文章

[转载]kd tree

[本文转自]http://www.cnblogs.com/eyeszjwang/articles/2429382.html k-d树(k-dimensional树的简称),是一种分割k维数据空间的数据结构.主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索). 应用背景 SIFT算法中做特征点匹配的时候就会利用到k-d树.而特征点匹配实际上就是一个通过距离函数在高维矢量之间进行相似性检索的问题.针对如何快速而准确地找到查询点的近邻,现在提出了很多高维空间索引结构和近似查询的算法,k-d树

k-d tree算法详解

k-d树(k-dimensional树的简称),是一种分割k维数据空间的数据结构.主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索). 1.应用背景 SIFT算法中做特征点匹配的时候就会利用到k-d树.而特征点匹配实际上就是一个通过距离函数在高维矢量之间进行相似性检索的问题.针对如何快速而准确地找到查询点的近邻,现在提出了很多高维空间索引结构和近似查询的算法,k-d树就是其中一种. 索引结构中相似性查询有两种基本的方式:一种是范围查询(range searches),另一种是K近邻查询

k-d tree算法

k-d树(k-dimensional树的简称),是一种分割k维数据空间的数据结构.主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索). 应用背景 SIFT算法中做特征点匹配的时候就会利用到k-d树.而特征点匹配实际上就是一个通过距离函数在高维矢量之间进行相似性检索的问题.针对如何快速而准确地找到查询点的近邻,现在提出了很多高维空间索引结构和近似查询的算法,k-d树就是其中一种. 索引结构中相似性查询有两种基本的方式:一种是范围查询(range searches),另一种是K近邻查询(K

k-d Tree in TripAdvisor

Today, TripAdvisor held a tech talk in Columbia University. The topic is about k-d Tree implemented in TripAdvisor  to efficiently search MASSIVE location tree. Problem Millions of locations, it's tough to perform Nearest Neighbor Search. Solution Us

Google interview question: k-nearest neighbor (k-d tree)

Question: You are given information about hotels in a country/city. X and Y coordinates of each hotel are known. You need to suggest the list of nearest hotels to a user who is querying from a particular point (X and Y coordinates of the user are giv

k-d tree

先以一个简单直观的实例来介绍k-d树算法.假设有6个二维数据点{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)},数据点位于二维空间内(如图2中黑点所示).k-d树算法就是要确定图2中这些分割空间的分割线(多维空间即为分割平面,一般为超平面).下面就要通过一步步展示k-d树是如何确定这些分割线的. k-d树算法可以分为两大部分,一部分是有关k-d树本身这种数据结构建立的算法,另一部分是在建立的k-d树上如何进行最邻近查找的算法. 构造kd树 kd树是一种对k维空间中的实例

k-d tree 学习笔记

以下是一些奇怪的链接有兴趣的可以看看: https://blog.sengxian.com/algorithms/k-dimensional-tree http://zgjkt.blog.uoj.ac/blog/1693 https://en.wikipedia.org/wiki/K-d_tree http://homes.ieu.edu.tr/hakcan/projects/kdtree/kdTree.html k-d tree就是一个把一个平面(或超平面)划分的东西- 例如一维情况就是在划分

KD tree

Kd-树 其实是K-dimension tree的缩写,是对数据点在k维空间中划分的一种数据结构.其实,Kd-树是一种平衡二叉树. 举一示例: 假设有六个二维数据点 = {(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)},数据点位于二维空间中.为了能有效的找到最近邻,Kd-树采用分而治之的思想,即将整个空间划分为几个小部分.六个二维数据点生成的Kd-树的图为: 对于拥有n个已知点的kD-Tree,其复杂度如下: 构建:O(log2n) 插入:O(log n) 删除:O(l

k-d tree模板练习

1. [BZOJ]1941: [Sdoi2010]Hide and Seek 题目大意:给出n个二维平面上的点,一个点的权值是它到其他点的最长距离减最短距离,距离为曼哈顿距离,求最小权值.(n<=500,000) 思路:k-d tree裸题. #include<cstdio> #include<algorithm> using namespace std; inline int read() { int x;char c; while((c=getchar())<'0'

k-d tree学习总结

本文转载自http://blog.csdn.net/zhjchengfeng5/article/details/7855241# 首先来一个问题: 给定平面上一个点集 E ,还有一个定点 V ,怎么在一群点中找出一个点 U,使得 V 与 U 的距离最近(欧几里得距离)? 当然,我们能够想到一种做法:枚举 E 中所有的点,找出它们中距离V 最近的点 U. 但是,假设现在有两个点集 E1 与 E2 ,对于 E2 中每一个点 Vi ,找出一个在E1 中的一个点 Ui,使得 Vi 到 Ui 的距离最短,