K-Means Clustering

Unsupervised Machine Learning范畴中,运用比较广泛的算法之一就有 K-means的身影,今天我们就来聊一聊 K-Means

什么是 K-Means Clustering

对于输入 unlabeled并且未归类的输入数据,我们通过 K-Means 算法来对数据进行归类,整个过程是没有 supervision,换而言之,我们对于数据的归类并不会进行学习,而是并行并按照顺序进行归类。

通畅我们会定义一个 K 变量,这个 K 是一个数量,表示有多少个 group。我们的所有 data points 都会被归入到一个 group 中。 但这个 group 有别于标签,每个 group 是一个 centroid (一个坐标量),表示一个 Mean 值,接下来我们会用 centroid和每个 data point 进行比较,哪个 data point 离该 centroid比较近,我们就归在这个 centroid中。然后,我们会根据归类情况,重新计算 centroid的值,然后再用这个坐标量和每个 data point 进行比较,优化归类,直到精确到某一精度,我们停止归类,并返回最终归类结果。我们再次总结一下过程:

  1. 有 K 个 centroids,我们循环 data points 并把每个 data points 归类于一个 centroids 的,根据 distance 来进行归类。(两个坐标的距离)
  2. 根据归类结果,重新计算 centroid,(通过均值计算法),重新得到一组新的 centroids
  3. 重复 1-2 的步骤直至 iteration 结束。通畅我们会指定一个 iteration 次数,例如循环100次。

当然,很多 lib 都已经有很简化的 K-Means 使用方法,我们先尝试自己实现一遍。到最后我会使用 Sklearn 的 K-Means 方法进行计算。

class KMeans:
    def __init__(self, k):
        self.k = k
        self.centroids = np.random.rand(self.k, X.shape[1]) # 这里我们随机生成一组 centroids
    
    def train(self, X, ITER=100, EOL = 1e-3): # ITER 是 iteration 次数,EOL 精确度误差
        centroids = np.random.rand(self.k, )
        centroidscopy = centroids.copy()
        for iter_ in range(ITER):
            dist = np.linalg.norm(X-centroids[0,:], axis = 1).reshape(-1, 1) #计算第一列的值和第一个 centroid 的距离
            for class_ in range(1, self.k): # 两个分组
                dist = np.append(dist, np.linalg.norm(X-centroids[1, :], axis = 1).reshape(-1,1), axis = 1)
            classes = np.argmin(dist, axis = 1) #进行分类
            for class_ in set(classes): #遍历分类
                centroids[class_, :] = np.mean(X[classes == class_, :], axis = 0) #重新计算生成新的 centroids
            if centrodis - centroidscopy < EOL: # 如果 centroids 和原来的 data point 误差值很小,则停止遍历
                break
        self.classes = classes
            
    def predict(self, X):
        dist = np.linalg.norm(X - self.centroids[0,:], axis = 1).reshape(-1, 1) # 计算所有第一列与第一个 centroid 的距离,然后根据列进行 norm
        for classes_ in range(1, self.k):
            dist = np.append(dist, np.linalg.norm(X-centrodis[1,:], axis = 1).reshape(-1, 1), axis = 1) # dist 数组中加上计算所有第二例与第二个 centroid 的距离,然后根据列进行 norm
        classes = np.argmin(dist, axis = 1) # 取第一列和第二列的最小值
        return classes #返回归类 set 

接下来我们来看一下 Sklearn 中的使用方法:

from sklearn import KMeans
kmeans = KMeans(n_clusters = 2, random_state = 0, n_init='auto') #定义 cluster 数量,会随机生成
kmeans.fit(X_train) # fit 我们的 data points

以上就是 K-Means Clustering 的基本概念~ Deep Learning 中还有很多其他很有效的算法,我们下次再见~

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值