机器学习--K-means聚类&DBSCAN
一、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_:
每个点的分类标签。
更多推荐

所有评论(0)