一、K-Means聚类
1.1 大致概念
K-Means聚类,又称为K均值聚类,是一种常用的聚类算法,且为典型的基于距离的聚类算法,属于无监督学习。其中,K均值是基于原型的、划分的距离技术,它试图发现用户指定个数的簇。其以欧氏距离作为相似度测试。
1.2 主要的聚类过程
- 猜测一些簇中心点的位置;
- 重复至收敛。
1.3 K-Means聚类的注意事项
- 簇数量需要先给定再聚类;
- 不适用于非线性边界;
- 数据量大的时候计算较慢。
1.4 K-Means聚类的优缺点
优点
- K-均值算法是解决聚类算法的一种经典算法,算法容易实现,简单而快速;
- 对处理大数据集,该算法是相对可伸缩的和高效率的,因为它的复杂度大约是 O(nkt) ,
其中 n 是所有对象的数目 k 是簇的数目,t 是迭代的次数。通常 k<<n。这个算法经常以局部
最优结束。
- 算法尝试找出使平方误差函数值最小的 k 个划分。当簇是密集的、球状或团状的,而簇
与簇之间区别明显时,它的聚类效果很好。
缺点
- k-均值只有在簇的平均值被定义的情况下才能使用,不适用于某些应用, 如涉及有
分类属性的数据不适用。
- 要求使用者必须事先给出要生成的簇的数目 k。
- 对初值敏感,对于不同的初始值,可能会导致不同的聚类结果。
- 不适合于发现非凸面形状的簇,或者大小差别很大的簇。
- 对于"噪声"和孤立点数据敏感,少量的该类数据能够对平均值产生极大影响。
二、Python实现
2.1 Talk is cheap, show me the code.
# 运行于Jupyter Notebook
%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 创建数据
from sklearn.datasets.samples_generator import make_blobs
# make_blobs 为聚类数据生成器
#x是一个shape为(300,2)的二维numpy.ndarray
#y_true是shape为(300,)的一维ienumpy.ndarray
x,y_true = make_blobs(n_samples = 300, #生成300条数据
centers =4, #四类数据
cluster_std=0.5, #方差一致
random_state=0)
# 绘制散点图
plt.rcParams['figure.figsize'] = (16,9)
plt.scatter(x[:,0],x[:,1],s=10,alpha=0.8)
plt.grid()
# 创建模型
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=4)
kmeans.fit(x)
y_kmeans = kmeans.predict(x)
# 画出簇中心点
plt.scatter(x[:,0],x[:,1],c=y_kmeans,s=50,cmap='viridis')
# centers为簇中心点的数据
centers = kmeans.cluster_centers_
plt.scatter(centers[:,0],centers[:,1],c='red',s=200,alpha=0.5)
创建数据
画出簇中心点
三、sklearn.cluster.KMeans
class sklearn.cluster.KMeans(
n_clusters=8, # 聚类中心的数目,默认为8
init=’k-means++’, # 聚类的初始化方案,{‘k-means++’, ‘random’ or an ndarray}
n_init=10, # kmeans随机运行次数
max_iter=300, # 算法运行的最大迭代次数
tol=0.0001, # 与inertia属性结合确定收敛条件
precompute_distances=’auto’, # 是否将数据全部放入内存,{‘auto’, True, False}
verbose=0, # 是否输出详细信息,int, default 0
random_state=None, # 用于随机产生中心的随机序列
copy_x=True, # 是否直接在原矩阵上进行计算。默认为True,会copy一份进行计算。
n_jobs=None, # 同时进行计算的核数(并发数)
algorithm=’auto’ # 可选的K-means距离计算算法,{“auto”, “full” or “elkan”, default=”auto”}
)
3.1 属性
属性名 |
解释 |
cluster_centers_ |
聚类中心的坐标 |
labels_ |
每个点的分类标签 |
inertia_ |
样本到最近聚类中心的距离平方和 |
n_iter_ |
算法运行时的迭代次数 |
3.2 方法
方法名 |
解释 |
fit() |
训练模型 |
fit_predict() |
|
fit_transform() |
|
get_params() |
获得模型的参数 |
predict() |
|
score() |
计算模型误差 |
set_params() |
|
transform() |
转换训练数据为群集距离空间 |
网友评论