zoukankan      html  css  js  c++  java
  • Andrew NgML第十四章无监督学习

    1.无监督学习概述

     图1.无监督学习

     有监督学习中,数据是有标签的,而无监督学习中的训练集是没有标签的,比如聚类算法。

     2.k-means算法

    k-means算法应用是十分广泛的聚类方法,它包括两个过程,首先是选取聚类中心,然后遍历每一个点,决定其属于哪个类;第二步是移动聚类中心点,根据刚才的聚类情况将聚类中心点移动,下面三个图很好地说明了这个过程:

     

    图2.初始化,并且计算距离。

    图3.计算距离后

     

    图4.根据最小化均方误差移动聚类中心点

     根据新的聚类中心点,再次重复这个过程,

    图5.迭代之后最终结果

     迭代之后最终结果,就算再运行k-means聚类算法,聚类中心点也不会改变了,

    图6.k-means算法输入

     输入包括k,之后会讲解如何选择k,训练集,x(i)是n维的,不是n+1维,通常舍去x_0=1项。

    图7.k-means算法过程

     K是指一共分为几簇,k是指每个聚类中心。

    首先随机初始化k各聚类中心点,循环以下过程:

    1.将m个样本点遍历,分到k个聚类中心中;

    2.根据各个簇中的点到聚类中心点的距离并取均值。

    对于聚类结果中,没有点的簇,通常是直接删去,那么K就变成了K-1簇。

    3.优化目标

    图8.k-means优化目标

    就是最小化代价函数,也叫失真代价函数。优化目标就是使点到聚类中心的平均距离最小。

    4.随机初始化

    这节会讲如何避开局部最优。

    图9.局部最优化情况

     如图就是局部最优化情况,两个类被分成了一个簇,一个簇被分开成了两份,这是不好的,是因为聚类中心店的初始化的问题。解决办法就是初始化多次,并且运行多次k-means聚类算法,得到结果,保证得到一个足够好的结果。

    图10.运行局部最优化算法

     随机初始化,重复k-means算法100次,通常是在50-1000之间,运行结束后,选取一个失真函数最小的聚类结果。

    随机初始化的情况,适用于K在2-10之间,多次随机初始化会比较好的得到正确的聚类结果,但是当不在此区间内,聚类结果并不会有很大的改善,K很大时一次聚类结果即可。

    5.选择簇的数量

    目前来说,还都是通过可视化的方法手动选择的。

    图11.如何选择聚类K的值

     选择K个聚类的值,并以损失函数为纵轴来判断,肘形函数,但是有时会像有部,是平滑的,也不好确定最终分为几类,所以这个肘形曲线并不能成为好的判断方法。

    但是最终的应用结果会告诉你应该分为几类。

    2020-4-13更新————————

    1.k-means继续学习

    看了上面之前的笔记,就发现,学习还停留在概念上面,没有具体的数学公式和实现代码,这就比较飘了。

    https://blog.csdn.net/huangfei711/article/details/78480078 这个讲的还是挺通俗易懂的,原来在计算过程中会出现虚拟的中心点啊,直到分类结果没有什么变化就认为是收敛了。

    首先随机选取K个点,然后计算所有其他点到这两个点的距离,根据小的确定分类,然后在各个类中再选出中心点,计算中心点是通过x/y轴的均值计算出一个可能是虚拟的点的坐标(重心),计算所有距离将点再分类,然后这样循环下去。

    https://blog.csdn.net/sinat_26917383/article/details/70240628,给出了使用sklearn实现的例子:

    import numpy as np
    from sklearn.cluster import KMeans
    data = np.random.rand(100, 3) #生成一个随机数据,样本大小为100, 特征数为3
    
    #假如我要构造一个聚类数为3的聚类器
    estimator = KMeans(n_clusters=3)#构造聚类器
    estimator.fit(data)#聚类
    label_pred = estimator.labels_ #获取聚类标签
    centroids = estimator.cluster_centers_ #获取聚类中心
    inertia = estimator.inertia_ # 获取聚类准则的总和
    
    #输出:
    >>> centroids
    array([[0.42927216, 0.57043035, 0.19739574],
           [0.76233694, 0.46150249, 0.69253087],
           [0.25571954, 0.41477208, 0.79997927]])
    >>> inertia
    13.015626730491624
  • 相关阅读:
    NOI2014题解
    BZOJ 3514 (动态树)
    [HNOI 2013] 旅行 (数学)
    [HNOI 2013] 消毒 (搜索,二分图匹配)
    大学的第一个自己的程序
    回归了
    OI——不后悔的两年
    对于民科吧s5_or吧友自增树的复杂度计算
    好久没有冒过泡了。。。
    非常无聊——STD::sort VS 基数排序
  • 原文地址:https://www.cnblogs.com/BlueBlueSea/p/9447180.html
Copyright © 2011-2022 走看看