本节课程的内容是聚类算法,主要介绍的是k均值和DBSCAN两个聚类算法,在了解过其基本的原理之后,就可以开始相应的实践操作
聚类:
在样本中寻找自然集群,事先是不知道存在哪些集群的。聚类是无监督学习,本质是探索数据的结构关系,常用于对客户细分,对文章聚类等
分类:对已经有标签的样本进行分类,已知存在有哪些类别
K-means
原理:事先划定k个点,计算其余点到这k个点的距离,根据距离最短原则划分类别,再重新计算k个类的中心,再进行迭代,直到中心的变化小于设定的阈值
确定聚类数k:K-means算法是无监督学习算法,事先并不知道数据可以聚成几类。使用画图的方式,在高维数据面前也是不可行的。
可以通过设定不同的k值,对应进行k-means聚类。计算k个聚簇内样本点到各自聚簇中心的距离和,把k个聚簇的距离和加总得到总距离。一般而言这个距离会随着k增大而减小,衰减的拐点对应的k值一般而言会是一个比较好的k值。
总距离可以表述为以下公式:
SSE=
Python实现:
from sklearn.cluster
import KMeans
km=KMeans(k)
km.fit(X)
iris上实现K-means
载入数据集
import pandas
iris =pandas.read_csv(
'http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data',header=
None)
iris.columns=[
'SepalLengthCm',
'SepalWidthCm',
'PetalLengthCm',
'PetalWidthCm',
'Species']
进行探索性数据分析,根据PetalWidthCm,PetalLengthCm绘制出三个类别的鸢尾花
import seaborn
as sns
import matplotlib.pyplot
as plt
%matplotlib inline
g=sns.FacetGrid(iris,hue=
'Species')
g.set(xlim=(
0,
2.5),ylim=(
0,
7))
g.map(plt.scatter,
'PetalWidthCm',
'PetalLengthCm').add_legend()
Kmeans聚类
from sklearn.cluster
import KMeans
X=iris[[
'PetalWidthCm',
'PetalLengthCm']]
km=KMeans(
2)
km.fit(X)
iris[
'cluster_k2']=km.predict(X)
km.predict(X)
绘图比较聚类结果
g=sns.FacetGrid(iris,hue=
'cluster_k2')
g.set(xlim=(
0,
2.5),ylim=(
0,
7))
g.map(plt.scatter,
'PetalWidthCm',
'PetalLengthCm').add_legend()
K-means算法的局限
K-means算法适用于数据集呈现出类圆形、球形分布的,如果数据没有呈现出这种规律,很可能聚类的效果会是很差的
DBSCAN
DBSCAN,全称是Density-Based Spatial Clustering of Applications with Noise,是一种基于密度的聚类方法
原理:根据和min_samples把数据点分为三类点,一类是CORE(图中红色点):周围距离内有大于或等于min_sample个样本点; REACHABLE(图中蓝色点):周围距离内的样本点数量小于min_sample,但是可以被CORE点覆盖的点(也就是在CORE点以为半径范围内的点) ; OUTLIER(图中蓝色):异常点,不属于任何一个类别
预先需要给定的参数是:、min_samples,且对参数的选择非常敏感
Python实现:
from sklearn.cluster
import DBSCAN
dbscan=DBSCAN(eps=
0.3,min_samples=
10)
dbscan.fit(X)
dbscan.labels_
iris上实现DBSCAN
生成数据集
from sklearn
import datasets
from pandas
import DataFrame
noisy_circles=datasets.make_circles(n_samples=
1000,factor=
.5,noise=
.05)
print(noisy_circles)
df=DataFrame()
df[
'x1']=noisy_circles[
0][:,
0]
df[
'x2']=noisy_circles[
0][:,
1]
df[
'label']=noisy_circles[
1]
df.sample(
10)
进行探索性数据分析
import seaborn
as sns
import matplotlib.pyplot
as plt
%matplotlib inline
g=sns.FacetGrid(df,hue=
'label')
g.map(plt.scatter,
'x1',
'x2').add_legend()
DBSCAN
from sklearn.cluster
import DBSCAN
dbscan=DBSCAN(eps=
0.2,min_samples=
10)
X=df[[
'x1',
'x2']]
dbscan.fit(X)
df[
'dbscan_label']=dbscan.labels_
g=sns.FacetGrid(df,hue=
'dbscan_label')
g.map(plt.scatter,
'x1',
'x2').add_legend()
from sklearn.cluster
import KMeans
km=KMeans(
2)
X=df[[
'x1',
'x2']]
km.fit(X)
df[
'kmeans_label']=km.predict(X)
g=sns.FacetGrid(df,hue=
'kmeans_label')
g.map(plt.scatter,
'x1',
'x2').add_legend()
补充知识
参数文档
K-means
- sklearn.cluster.KMeans
- sklearn 文档翻译之 sklearn.cluster.KMeans,文档是对K-means参数的中文解释
DBSCAN
- sklearn.cluster.dbscan
- 用scikit-learn学习DBSCAN聚类,文档是对DBSCAN参数的中文解释
算法步骤以及优缺点解释
K-means
DBSCAN
- 阅读dbscan算法步骤,了解DBSCAN的算法步骤
- 阅读DBSCAN聚类︱scikit-learn中一种基于密度的聚类方式 中DBSCAN的优缺点部分
任何算法都是有局限的,了解不同算法的优缺点可以帮助你更有针对性地应用算法
扩展阅读
聚类算法的模型评估
相对于有标签的数据集,可以比较容易地进行性能评估,基于无标签的数据建立的聚类算法模型,往往比较难评估其模型性能。
聚类模型的性能指标主要分为内部指标(Internal Index)和外部指标(External Index)两类。内部指标适用于无标注数据,根据聚类结果中簇内相似度和簇间分离度进行聚类质量评估;而外部指标适用于有标注数据,将聚类结果与已知类标签进行比较。
阅读聚类算法评价指标,了解如何对在有标签、无标签数据上建立起的聚类模型分别进行评估