• 1. K-Means原理解析


    1. K-Means原理解析

    2. K-Means的优化

    3. sklearn的K-Means的使用

    4. K-Means和K-Means++实现

    1. 前言

    我们在一开始的时候应该就说过,机器学习按照有无标签可以分为“监督学习”和“非监督学习”。

    监督学习里面的代表算法就是:SVM、逻辑回归、决策树、各种集成算法等等。

    非监督学习主要的任务就是通过一定的规则,把相似的数据聚集到一起,简称聚类。我们今天讲的K-Means算法是在非监督学习比较容易理解的一个算法,也是聚类算法中最著名的算法。

    2. K-Means原理

    K-Means是典型的聚类算法,K-Means算法中的k表示的是聚类为k个簇,means代表取每一个聚类中数据值的均值作为该簇的中心,或者称为质心,即用每一个的类的质心对该簇进行描述。

    2.1 K-Means步骤

    1. 创建k个点作为起始质心。
    2. 计算每一个数据点到k个质心的距离。把这个点归到距离最近的哪个质心。
    3. 根据每个质心所聚集的点,重新更新质心的位置。
    4. 重复2,3,直到前后两次质心的位置的变化小于一个阈值。

    整个变化的过程如果用图呈现出来会形象很多,下面的图就是k=2的K-Means的过程:

    image

    2.2 K值的确定

    K-Means算法一般都只有一个超参数,就是K。那我们拿到一个数据后,要吧数据分成几类呢?我们就来讨论下这个问题。

    1. 首先一个具体的问题肯定有它的具体的业务场景,K值需要根据业务场景来定义。
    2. 如果业务场景无法确定K值,我们也有技术手段来找一个合适的K。这个方法就是手肘法。

    2.3 手肘法

    K-Means算法中每一步都可以计算出loss值又称为SSE。loss值的计算方式就是每个聚类的点到它们质心的距离的平方。

    [SSE = sumlimits_{i=1}^ksumlimits_{x in C_i} |x-mu_i|^2 ]

    指定一个Max值,即可能的最大类簇数。然后将类簇数K从1开始递增,一直到Max,计算出Max个SSE。根据数据的潜在模式,当设定的类簇数不断逼近真实类簇数时,SSE呈现快速下降态势,而当设定类簇数超过真实类簇数时,SSE也会继续下降,当下降会迅速趋于缓慢。通过画出K-SSE曲线,找出下降途中的拐点,即可较好的确定K值。

    image

    这样手肘图的拐点应该是k=4的时候,所以我们可以定k=4的时候聚类效果比较好。

    3. K-Means与KNN

    初学者很容易把K-Means和KNN搞混,两者其实差别还是很大的。

    K-Means是无监督学习的聚类算法,没有样本输出;而KNN是监督学习的分类算法,有对应的类别输出。KNN基本不需要训练,对测试集里面的点,只需要找到在训练集中最近的k个点,用这最近的k个点的类别来决定测试点的类别。而K-Means则有明显的训练过程,找到k个类别的最佳质心,从而决定样本的簇类别。

    当然,两者也有一些相似点,两个算法都包含一个过程,即找出和某一个点最近的点。两者都利用了最近邻(nearest neighbors)的思想。

    4. 总结

    K-Means的原理是很简单,但是我们仔细想想我们处理K-Means的思想好想和别的方法不太一样。我们是先去猜想我们想要的结果,然后根据这个猜想去优化损失函数,再重新调整我们的猜想,一直重复这两个过程。

    其实这个猜想就是我们要求出的隐藏变量,优化损失函数的过程,就是最大化释然函数的过程。K-Means的算法就是一个EM算法的过程。

  • 相关阅读:
    Django视图
    Django模板系统
    错误:java.sql.SQLException: Access denied for user 'xxx'@'localhost' (using password: YES)
    关于Spring使用XML配置AOP时pointcut位置的一个小问题
    在jsp页面中将Java对象转换位JS对象的一个思路
    关于artifact XXXX:war exploded: Error during artifact deployment. See server log for details.错误
    框架集合——Java面向对象基础(33)
    使用Socket简单模拟C/S消息传递(UDP)——Java面向对象基础(32)
    使用Socket简单模拟C/S消息传递(TCP)——Java面向对象基础(31)
    对象序列化——Java面向对象基础(30)
  • 原文地址:https://www.cnblogs.com/huangyc/p/10224045.html
Copyright © 2020-2023  润新知