当前位置:   article > 正文

机器学习—K-means聚类、密度聚类、层次聚类理论与实战_密度聚类和kmeans

密度聚类和kmeans

引言

  聚类是机器学习算法中“新算法”出现最多、最快的领域。一个重要的原因是聚类不存在客观标准。下面我们分别介绍K-means聚类、DBSCAN算法(密度聚类)、AgglomerativeClustering算法(层次聚类)。

一、K-means聚类

1.算法原理

在这里插入图片描述

2.算法参数、属性、方法介绍

sklearn.cluster.KMeans

class sklearn.cluster.KMeans(n_clusters=8, *, init='k-means++', n_init=10, max_iter=300, tol=0.0001, 
precompute_distances='deprecated', verbose=0, random_state=None, copy_x=True, n_jobs='deprecated', algorithm='auto')
  • 1
  • 2

参数介绍:

  • n_clusters:一个整数,指定分类簇的数量。
  • init:一个字符串,指定初始均值向量的策略。可以为如下:
    • ‘k-means++’:该初始化策略选择的初始均值向量相互之间都距离较远,它的效果较好(这个策略一定程度上可以解决K均值算法收敛依赖初始化的均值的问题)
    • ‘random’:从数据集中随机选择K个样本作为初始均值向量。
    • 或者提供一个数组,数组的形状为(n_clusters.n_features),该数组作为初始均值向量。
  • n_init:一个整数,指定了k均值算法运行的次数。每一次都会选择一组不同的初始化均值向量,最终算法会选择最佳的分类簇来作为最终的结果。
  • max_iter:一个整数,指定了单轮k均值算法中,最大的迭代次数。算法总的最大迭代次数为max_iter * n_init。
  • precompute_distances:可以为布尔值或者字符串’auto’。该参数指定是否提前计算好样本之间的距离(如果提前计算距离,则需要更多的内存,但是算法会运行得更快)。
    • auto’:如果n_samples*n_clusters > 12 million,则不提前计算;
    • True:总是提前计算;
    • False:总是不提前计算。
  • tol:一个浮点数,指定了算法收敛的阈值。
  • n_jobs:一个正数。指定任务并形时指定的CPU数量。如果为-1则使用所有可用的CPU。
  • verbose:一个整数。如果为0,则不输出日志信息;如果为1,则每隔一段时间打印一次日志信息;如果大于1,则打印日志信息更频繁。
  • random_state:一个整数或者一个RandomState实例,或者None。
    • 如果为整数,则它指定了随机数生成器的种子。
    • 如果为RandomState实例,则指定了随机数生成器。
    • 如果为None,则使用默认的随机数生成器。
  • copy_x:布尔值,主要用于precompute_distances=True的情况。
    • 如果为True,则预计算距离的时候,并不修改原始数据。
    • 如果为False,则预计算距离的时候,会修改原始数据用于节省内存;然后当算法结束的时候,会将原始数据返还。但是可能会因为浮点数的表示,会有一些精度误差。

属性介绍:

  • cluster_centers_:给出分类簇的均值向量。
  • labels_:给出了每个样本所属的簇的标记。
  • inertia_:给出了每个样本距离它们各自最近的簇中心的距离之和。
  • n_iter_ : 迭代次数

方法介绍:

  • fit(XL,y]):训练模型。
  • fit_predict(X[,y]):训练模型并预测每个样本所属的簇。它等价于先调用fit方法,后调用predict方法。
  • predict(X):预测样本所属的簇。
  • score(X[,y]):给出了样本距离个簇中心的偏移量的相反数。

3.算法实战

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets.samples_generator import make_blobs
from sklearn import cluster
from sklearn.metrics import adjusted_rand_score


# make_blobs函数产生的是分隔的高斯分布的聚类簇
def create_data(centers, num=100, std=0.7):
    X, labels_true = make_blobs(n_samples=num, centers=centers, cluster_std=std)
    return X, labels_true


# 观察生成点
def plot_data(*data):
    X, labels_true = data
    labels = np.unique(labels_true)
    fig, ax = plt.subplots()
    colors = 'rgbyckm'
    for i, label in enumerate(labels):
        position = labels_true == label
        # 散点图
        ax.scatter(X[position, 0], X[position, 1], label="cluster %d" % label, color=colors[i % len(colors)])
    # 图例位置
    ax.legend(loc='best')
    ax.set_xlabel("X_0")
    ax.set_ylabel("X_1")
    ax.set_title('data')
    plt.show()


# 考察簇的数量
def test_Kmeans(*data):
    X, label_true = data
    nums = range(1, 20)
    # ARI指数
    ARIS = []
    Distances = []
    for num in nums:
        cls = cluster.KMeans(n_clusters=num, init='k-means++')
        cls.fit(X)
        predicted_labels = cls.predict(X)
        # ARI指标
        ARIS.append(adjusted_rand_score(label_true, predicted_labels))
        # 距离之和
        Distances.append(cls.inertia_)
    return nums, ARIS, Distances


# 寻找最佳聚类中心
def plot_kmeans(*data
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/774617
推荐阅读
相关标签
  

闽ICP备14008679号