聚类

概述

统计学的观点看,聚类分析是通过数据建模简化数据的一种方法。
机器学习角度讲,簇相当于隐藏模式

相关文献:
- 【书籍】数据挖掘概念与技术
- Comparing different clustering algorithms on toy datasets(在同一数据集上,不同聚类算法的效果)
- 聚类算法简介
- 聚类算法分类
- 聚类分析、数据挖掘、关联规则这几个概念的关系

基于距离的聚类 – kmeans

限制:kmeans需要指定最终形成的类的数量。

Mini Batch K-Means(kmeans变种)

场景】更适合大数据量,高维度的情况。
关系】Mini Batch K-Means = k-means + 随机抽样

参考
用scikit-learn学习K-Means聚类(包括K值评估标准
scikit-learn学习之K-means聚类算法与 Mini Batch K-Means算法

scikit-learn 中kmeans使用

这里放上一个scikit-learn官方的例子,在这些例子中,加入了一些注释,帮助读者理解。

#!/usr/bin/python
# -*- coding: utf-8 -*-

"""
=========================================================
K-means Clustering
=========================================================

The plots display firstly what a K-means algorithm would yield
using three clusters. It is then shown what the effect of a bad
initialization is on the classification process:
By setting n_init to only 1 (default is 10), the amount of
times that the algorithm will be run with different centroid
seeds is reduced.
The next plot displays what using eight clusters would deliver
and finally the ground truth.

"""
print(__doc__)


# Code source: Gaël Varoquaux
# Modified for documentation by Jaques Grobler
# License: BSD 3 clause

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D


from sklearn.cluster import KMeans
from sklearn import datasets

np.random.seed(5)

centers = [[1, 1], [-1, -1], [1, -1]]
iris = datasets.load_iris() # 获取实验数据。
X = iris.data
y = iris.target # 标签。(标示花的分类是哪个)

estimators = {'k_means_iris_3': KMeans(n_clusters=3),
              'k_means_iris_8': KMeans(n_clusters=8),
              'k_means_iris_bad_init': KMeans(n_clusters=3, n_init=1,
                                              init='random')}


fignum = 1
for name, est in estimators.items():
    fig = plt.figure(fignum, figsize=(4, 3))
    plt.clf()
    ax = Axes3D(fig, rect=[0, 0, .95, 1], elev=48, azim=134)

    plt.cla()
    est.fit(X) # 对 X 中的数据进行聚类。
    labels = est.labels_ # 获取聚类结束之后,各个数据的标签(用来标示 聚类结果)。

    ax.scatter(X[:, 3], X[:, 0], X[:, 2], c=labels.astype(np.float)) # X 行数与 lables的元素个数是一样的。所以用labels作为颜色的标志。

    # 用来显示坐标轴数据,刻度。
    ax.w_xaxis.set_ticklabels([])
    ax.w_yaxis.set_ticklabels([])
    ax.w_zaxis.set_ticklabels([])
    # 用来说明坐标轴名称。
    ax.set_xlabel('Petal width')
    ax.set_ylabel('Sepal length')
    ax.set_zlabel('Petal length')
    fignum = fignum + 1

# Plot the ground truth
fig = plt.figure(fignum, figsize=(4, 3))
plt.clf()
ax = Axes3D(fig, rect=[0, 0, .95, 1], elev=48, azim=134)

plt.cla()

for name, label in [('Setosa', 0),
                    ('Versicolour', 1),
                    ('Virginica', 2)]:
    # numpy 的高级索引使用
    ax.text3D(X[y == label, 3].mean(),
              X[y == label, 0].mean() + 1.5,
              X[y == label, 2].mean(), name,
              horizontalalignment='center',
              bbox=dict(alpha=.5, edgecolor='w', facecolor='w'))
# Reorder the labels to have colors matching the cluster results
y = np.choose(y, [1, 2, 0]).astype(np.float)
ax.scatter(X[:, 3], X[:, 0], X[:, 2], c=y)

ax.w_xaxis.set_ticklabels([])
ax.w_yaxis.set_ticklabels([])
ax.w_zaxis.set_ticklabels([])
ax.set_xlabel('Petal width')
ax.set_ylabel('Sepal length')
ax.set_zlabel('Petal length')
plt.show()

参考:
[Python] Scikit-learn的kmeans聚类
numpy基本使用

层次聚类

一个层次的聚类方法将数据对象组织成一棵聚类的树。
分类
层次聚类分为分裂的(自上而下),凝聚的(自下而上)两种方式。

适用场景
挖掘数据的潜在关系。

缺陷
一旦一个步骤(合并或分裂)完成,它就不能撤销。

基于密度的聚类 – DBSCAN

K-Means善于处理凸数据集问题,但对于非凸数据集的聚类表现不好。而基于密度的聚类从某种程度上克服了这类缺点。
【wiki】什么是凸集?
DBSCAN密度聚类算法
用scikit-learn学习DBSCAN聚类

聚类结果评价

【知乎】如何评价聚类结果的好坏?
【scikit官网】Empirical evaluation of the impact of k-means initialization(对于kmeans初始化影响的经验评价)

tips:

  1. 为方便展示聚类效果,可在2D数据上进行聚类。(可在二维坐标上展示)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值