python手写聚类算法:Kmeans&DBscan
算法思路以及步骤介绍
首先,我们分别介绍一下Kmeans算法以及DBSCAN算法。
Kmeans算法步骤:首先先随机的选择K个点(这里的K是超参数),这K个点作为中心点,对于剩下的所有的点,计算剩下的点和这三个点的距离,距离中最小的,认为属于这个类。在更新完一遍之后,计算类中的均值向量作为新的中心,再次重复上面的步骤,直到类的中心不变。主要的思路就是:每一类一定有一个中心,这个类中的对象一定离自己所属的类的中心最近,在和所有的中心的距离中。
DBSCAN的思路是通过定义了核心对象和密度直达来进行聚类(优点像感染式的聚类),其中核心对象指的是,此对象的较近的距离内有足够多的样本的点,这个距离和点的个数都是我们来决定的。这个域里面的对象都叫做密度直达的点,对于这些点,如果也是一个核心对象的话,就把它们的领域也加入到这个类里面,以此类推,直到所有的核心对象都已经考虑过了,停止算法。主要的思路就是,如果我们是一类,我们一定离的比较足够近,而如果你和其他的一个足够近,那么说明可能大家都是一类。
手写代码
Kmeans
# 输入没有标签的点
# 返回分类的情况(类别及对应的样本)
# 实现输入新的点,可以完成对于点类别的预测
class Kmeans:
def __init__(self):
pass
def distance(self, Xi):
import numpy as np
dist = []
for k in self.centroid: # 对模型里面所有的样本进行遍历
dist.append(np.linalg.norm(k - Xi, ord=self.p))
dist0 = list(enumerate(dist))
near = sorted(dist0, key=lambda x: x[1])[0][0]
return near
def predict(self, Xi):
import numpy as np
num = Xi.shape[0]
dist = []
for i