聚类算法
聚类算法被广泛应用于数据搜索、样本分类中。想象你要在一个有100万本书的图书馆里,找到与你手中这本书最相似的5本书。如果一本一本地比较,你需要比较100万次。
向量数据库通过多次多层级聚类把相似的数据放在"附近",建立不同层级,搜索时就像在分区清晰的图书馆中找书,快速到达目标区域。
例如可以把图书聚类为10类,判断当前图书距离哪类的质心最近,然后去该类中搜索。该类中又可以聚类为N类,再次判断当前图书距离哪类的质心最近,然后去该类中搜索。多次迭代指数级缩小搜索范围后,最后遍历对比距离即可。
当然,聚类对于边界模糊的数据效果不佳,例如你想找《明朝哪些年》,它既是小说,又是历史。很可能在某一层级距离计算错误,导致结果不准确。虽然可以通过分层聚类解决,但计算量会大大增加。
此外,聚类结构是基于当前数据快照构建的。当有新数据不断加入或旧数据被删除时,原有的聚类结构可能不再最优甚至失效。增量式更新聚类结构通常比全量重新聚类更复杂且效果可能打折扣。
K 均值算法
这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设 K 个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。
K 均值算法如何划分集群:
-
随机从每个集群中选取 K 个数据点作为质心(centroids),因此同一组数据多次运行,分组结果可能不同。
-
将每一个数据点与距离自己最近的质心划分在同一集群,即生成 K 个新集群。
-
找出新集群的质心,这样就有了新的质心。
-
重复 2 和 3,直到结果收敛,即不再有新的质心出现。
这样的算法基于距离和质心,天然倾向于发现球状或凸形的簇。对于流形、环形、相互缠绕或具有复杂边界的不规则形状的数据分布,效果往往不佳。可以考虑使用DBSCAN算法。
距离计算公式:
一维坐标系中,设 A(x1),B(x2),则 A,B 之间的距离为
二维坐标系中,设 A(x1,y1),B(x2,y2),则 A,B 之间的距离为
三维坐标系中,设 A(x1,y1,z1),B(x2,y2,z2),则 A,B 之间的距离为
以此类推