机器学习-----K-Means

聚类的定义

    将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类。由聚类所生成的簇是一组数据对象的集合,这些对象与同一个簇中的对象彼此相似,与其他簇中的对象相异。“物以类聚,人以群分”,在自然科学和社会科学中,存在着大量的分类问题。聚类分析又称群分析,它是研究(样品或指标)分类问题的一种统计分析方法。聚类分析起源于分类学,但是聚类不等于分类。聚类与分类的不同在于,聚类所要求划分的类是未知的。聚类分析内容非常丰富,有系统聚类法、有序样品聚类法、动态聚类法、模糊聚类法、图论聚类法、聚类预报法等

K-Means

    K-means算法是硬聚类算法,是典型的基于原型的目标函数聚类方法的代表,它是数据点到原型的某种距离作为优化的目标函数,利用函数求极值的方法得到迭代运算的调整规则。K-means算法以欧式距离作为相似度测度,它是求对应某一初始聚类中心向量V最优分类,使得评价指标J最小。算法采用误差平方和准则函数作为聚类准则函数。
    K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。
    k个初始类聚类中心点的选取对聚类结果具有较大的影响,因为在该算法第一步中是随机的选取任意k个对象作为初始聚类的中心,初始地代表一个簇。该算法在每次迭代中对数据集中剩余的每个对象,根据其与各个簇中心的距离将每个对象重新赋给最近的簇。当考察完所有数据对象后,一次迭代运算完成,新的聚类中心被计算出来。如果在一次迭代前后,J的值没有发生变化,说明算法已经收敛。

K-Means算法过程

  • 从N个文档随机选取K个文档作为质心
  • 对剩余的每个文档测量其到每个质心的距离,并把它归到最近的质心的类
  • 重新计算已经得到的各个类的质心
  • 迭代2~3步直至新的质心与原质心相等或小于指定阈值,算法结束

具体如下:
输入:k, data[n];

1 选择k个初始中心点,例如c[0]=data[0],…c[k-1]=data[k-1];
2 对于data[0]….data[n],分别与c[0]…c[k-1]比较,假定与c[i]差值最少,就标记为i;
3 对于所有标记为i点,重新计算c[i]={ 所有标记为i的data[j]之和}/标记为i的个数;
4 重复(2)(3),直到所有c[i]值的变化小于给定阈值。

k-means 算法缺点

  • 在 K-means 算法中 K 是事先给定的,这个 K 值的选定是非常难以估计的。
  • 在 K-means 算法中,首先需要根据初始聚类中心来确定一个初始划分,然后对初始划分进行优化。这个初始聚类中心的选择对聚类结果有较大的影响,一旦初始值选择的不好,可能无法得到有效的聚类结果,这也成为 K-means算法的一个主要问题。

sklearn中的KMeans

在sklearn中处理kmeans聚类问题,用到的是 sklearn.cluster.KMeans 这个类。

参数:

  • n_clusters:整形,缺省值=8, 生成的聚类数,即产生的质心(centroids)数。
  • n_clusters:整形,缺省值=8, 生成的聚类数,即产生的质心(centroids)数。
  • n_init:整形,缺省值=10, 用不同的质心初始化值运行算法的次数,最终解是在inertia意义下选出的最优结果。
  • init:有三个可选值:'k-means++', 'random',或者传递一个ndarray向量。此参数指定初始化方法,默认值为'k-means++'。
  • precompute_distances:三个可选值,‘auto’,True 或者 False。预计算距离,计算速度更快但占用更多内存。
  • tol:float形,默认值= 1e-4, 与inertia结合来确定收敛条件。
  • n_jobs:整形数。指定计算所用的进程数。内部原理是同时进行n_init指定次数的计算。
  • random_state:整形或 numpy.RandomState 类型,可选, 用于初始化质心的生成器(generator)。如果值为一个整数,则确定一个seed。此参数默认值为numpy的随机数生成器。
  • verbose:整形,默认值=0
  • Verbosity mode
  • copy_x:布尔型,默认值=True, 当我们precomputing distances时,将数据中心化会得到更准确的结果。

属性:

  • cluster_centers_:向量,[n_clusters, n_features]
  • Coordinates of cluster centers 
  • Labels_:每个点的分类
  • inertia_:float形,每个点到其簇的质心的距离之和。

sklearn官网示例

import numpy as np
import matplotlib.pyplot as plt

from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs

plt.figure(figsize=(12, 12))

n_samples = 1500
random_state = 170
X, y = make_blobs(n_samples=n_samples, random_state=random_state)

# Incorrect number of clusters
y_pred = KMeans(n_clusters=2, random_state=random_state).fit_predict(X)

plt.subplot(221)
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.title("Incorrect Number of Blobs")

# Anisotropicly distributed data
transformation = [[0.60834549, -0.63667341], [-0.40887718, 0.85253229]]
X_aniso = np.dot(X, transformation)
y_pred = KMeans(n_clusters=3, random_state=random_state).fit_predict(X_aniso)

plt.subplot(222)
plt.scatter(X_aniso[:, 0], X_aniso[:, 1], c=y_pred)
plt.title("Anisotropicly Distributed Blobs")

# Different variance
X_varied, y_varied = make_blobs(n_samples=n_samples,
                                cluster_std=[1.0, 2.5, 0.5],
                                random_state=random_state)
y_pred = KMeans(n_clusters=3, random_state=random_state).fit_predict(X_varied)

plt.subplot(223)
plt.scatter(X_varied[:, 0], X_varied[:, 1], c=y_pred)
plt.title("Unequal Variance")

# Unevenly sized blobs
X_filtered = np.vstack((X[y == 0][:500], X[y == 1][:100], X[y == 2][:10]))
y_pred = KMeans(n_clusters=3,
                random_state=random_state).fit_predict(X_filtered)

plt.subplot(224)
plt.scatter(X_filtered[:, 0], X_filtered[:, 1], c=y_pred)
plt.title("Unevenly Sized Blobs")

plt.show()

转载:http://www.cnblogs.com/chrisma/

猜你喜欢

转载自blog.csdn.net/yb1020368306/article/details/81279648