一、K-means聚类

1、基本概念

1)聚成多少个簇:需要知道K的值

2)距离的度量:一般采用欧式距离

3)质心:各向量的均值

4)优化目标:

2、常见的距离

3、步骤

4、聚类效果评价方式

1)轮廓系数

a(i):对于第i个元素xi,计算xi与其同一个簇内所有其他元素距离的平均值,表示簇内的凝聚程度

b(i):选取xi外的一个簇,计算xi与该簇内所有点距离的平均距离,遍历其他所有簇,取所有平均值中最小的一个,表示簇间的分离度

(1)轮廓系数范围在[-1,1]之间,该值越大,越合理

(2)si接近1,则说明样本i聚类合理;

(3)si接近-1,则说明样本i更应该分类到另外的簇

(4)若si近似为0,则说明样本i在两个簇的边界上

5、K-means的API参数

class sklearn.cluster.KMeans(n_clusters=8, init=’kmeans++’, n_init=10, max_iter=300, tol=0.0001, precompute_distances=’auto’, verbose=0, random_state=None, copy_x=True, n_jobs=None, algorithm=’auto’)[source]

【参数:】

n_clusters: 类中心的个数,就是要聚成几类。【默认是8个】

init:参初始化的方法,默认为'k-means++'

(1)'k-means++': 用一种特殊的方法选定初始质心从而能加速迭代过程的收敛.

(2) ‘random’:  随机从训练数据中选取初始质心。

(3) 如果传递的是一个ndarray,则应该形如 (n_clusters, n_features) 并给出初始质心。

n_init: 整形,缺省值=10

用不同的质心初始化值运行算法的次数,最终解是在inertia意义下选出的最优结果。

max_iter :

执行一次k-means算法所进行的最大迭代数。

Tol: 与inertia结合来确定收敛条件。

precompute_distances:三个可选值,‘auto’,True 或者 False。

预计算距离,计算速度更快但占用更多内存。

(1)‘auto’:如果 样本数乘以聚类数大于 12million 的话则不预计算距离。

(2)True:总是预先计算距离。

(3)False:永远不预先计算距离。

verbose:整形,默认值=0

random_state :随机状态

copy_x:布尔型,默认值=True

当我们precomputing distances时,将数据中心化会得到更准确的结果。如果把此参数值设为True,则原始数据不会被改变。如果是False,则会直接在原始数据 上做修改并在函数返回值时将其还原。但是在计算过程中由于有对数据均值的加减运算,所以数据返回后,原始数据和计算前可能会有细小差别。

algorithm:'auto','full' or 'elkan'.默认为'auto'
full:采用经典的EM算法
elkan:通过使用三角不等式从而更有效,但不支持稀疏数据
auto:数据稀疏选择full模式,数据稠密选择elkan模式

【属性】

cluster_centers_: 一个n-clusters*n_features的矩阵,表示聚类中心的坐标

Labels_:

每个点的分类标签。

inertia_:float形

每个点到其簇的质心的距离之和。

n_iter_ : int

迭代次数。

6、实际运用

通过网盘分享的文件:datingTestSet2.txt
链接: https://pan.baidu.com/s/1ppjHnaeHVBIydlJ7-4a9cw 提取码: y5qu

import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
from sklearn import metrics
a = pd.read_csv('datingTestSet2.txt', sep='\t', header=None)
a.columns = ['F1', 'F2', 'F3', 'Class']
x = a[['F1', 'F2', 'F3']]
from sklearn.metrics import silhouette_score
scores=[]
for i in range(2,15):
    labels=KMeans(n_clusters=i,random_state=0,max_iter=1000).fit(x).labels_
    score = silhouette_score(x, labels)
    scores.append(score)
    print(score)
# 找到最佳k值
best= np.argmax(scores)+2  # +2因为range从2开始
print('最佳k值:',best)
print("最高轮廓系数:", max(scores))

import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif']=['Microsoft YaHei']
mpl.rcParams['axes.unicode_minus']=False
plt.plot(list(range(2,15)), scores)
plt.xlabel("聚类数量")
plt.ylabel("轮廓系数得分")
plt.show()
#聚类
km = KMeans(n_clusters=3).fit(x)
a['cluster'] = km.labels_

7、优缺点

1)优点

简单,快速,适合常规的数据集

2)缺点

(1)K值难以确定

(2)很难发现任意形状的簇

二、DBSCAN

1、概念

基于密度的带噪声的空间聚类应用算法,它是将簇定义为密度相连的点的最大集合,能够把具有高密度的区域划分为簇,并在噪声的空间数据集中发现任意形状的聚类

2、要点

1)核心对象:A点

2)E邻域:给定对象半径为E内的区域

3)直接密度可达:

4)密度可达:

5)边界点:B点、C点

6)离群点:N点

3、实现过程

1)输入数据集

2)指定半径

3)指定密度阈值

4、DBSCAN的API参数

class sklearn.cluster.DBSCAN(eps=0.5, min_samples=5, metric=’euclidean’, algorithm=’auto’, leaf_size=30, p=None, n_jobs=None)

eps: DBSCAN算法参数,即我们的ϵϵ-邻域的距离阈值,和样本距离超过ϵϵ的样本点不在ϵϵ-邻域内。默认值是0.5.一般需要通过在多组值里面选择一个合适的阈值。eps过大,则更多的点会落在核心对象的ϵϵ-邻域,此时我们的类别数可能会减少, 本来不应该是一类的样本也会被划为一类。反之则类别数可能会增大,本来是一类的样本却被划分开。

min_samples: DBSCAN算法参数,即样本点要成为核心对象所需要的ϵϵ-邻域的样本数阈值。默认值是5. 一般需要通过在多组值里面选择一个合适的阈值。通常和eps一起调参。在eps一定的情况下,min_samples过大,则核心对象会过少,此时簇内部分本来是一类的样本可能会被标为噪音点,类别数也会变多。反之min_samples过小的话,则会产生大量的核心对象,可能会导致类别数过少。

metric:最近邻距离度量参数。可以使用的距离度量较多,一般来说DBSCAN使用默认的欧式距离(即p=2的闵可夫斯基距离)就可以满足我们的需求。可以使用的距离度量参数有:

a) 欧式距离 “euclidean”:

b) 曼哈顿距离 “manhattan”

c) 切比雪夫距离“chebyshev”

…

还有一些其他不是实数的距离度量,一般在DBSCAN算法用不上,这里也就不列了。

algorithm:最近邻搜索算法参数,算法一共有三种,第一种是蛮力实现,第二种是KD树实现,第三种是球树实现。对于这个参数,一共有4种可选输入,‘brute’对应第一种蛮力实现,‘kd_tree’对应第二种KD树实现,‘ball_tree’对应第三种的球树实现, ‘auto’则会在上面三种算法中做权衡,选择一个拟合最好的最优算法。需要注意的是,如果输入样本特征是稀疏的时候,无论我们选择哪种算法,最后scikit-learn都会去用蛮力实现‘brute’。个人的经验,一般情况使用默认的 ‘auto’就够了。 如果数据量很大或者特征也很多,用"auto"建树时间可能会很长,效率不高,建议选择KD树实现‘kd_tree’,此时如果发现‘kd_tree’速度比较慢或者已经知道样本分布不是很均匀时,可以尝试用‘ball_tree’。而如果输入样本是稀疏的,无论你选择哪个算法最后实际运行的都是‘brute’。

 p: 最近邻距离度量参数。只用于闵可夫斯基距离和带权重闵可夫斯基距离中p值的选择,p=1为曼哈顿距离, p=2为欧式距离。如果使用默认的欧式距离不需要管这个参数。

【属性】

Labels_:

每个点的分类标签。

更多推荐