0
点赞
收藏
分享

微信扫一扫

【案例】聚类算法

搬砖的小木匠 2022-01-20 阅读 80

KMEANS聚类

https://www.cnblogs.com/pinard/p/6164214.html

1、简述一下K-means算法的原理和工作流程

  1. 随机选择K个样本点作为初始质心

  2. 分别计算其他样本到K个质心的距离,对于每一个样本将其划分到与其距离最近的簇内

  3. 对于新的簇,计算新的簇中心

  4. 重复2,3步,直到簇中心没有移动

2、K-means中常用的到中心距离的度量有哪些?

  1. 欧式距离

        向量相减平方和开根号

        

      2.曼哈顿距离

        向量相减的绝对值之和

         

      3.余弦相似度(处理文档时)

         

3、K-means中的k值如何选取?

  1. 手肘法

  2. 轮廓系数法

    K-means聚类最优k值的选取_qq_15738501的博客-CSDN博客_kmeans聚类k的选取

4、K-means算法中初始点的选择对最终结果有影响吗?

        有影响,初始点的位置的不同会影响最终聚类效果。

        初始点的选择尽量使得相互之间的距离最远

5、K-means聚类中每个类别中心的初始点如何选择?

  1. 选择批次距离尽可能远的K个点
  2. 选用层次聚类或者Canopy算法进行初始聚类,然后利用这些类簇的中心点作为KMeans算法初始类簇中心点。

6、K-means中空聚类的处理

  1. 选择一个距离当前任何质心最远的点。这将消除当前对总平方误差影响最大的点。
  2. 从具有最大SSE的簇中选择一个替补的质心,这将分裂簇并降低聚类的总SSE。如果有多个空簇,则该过程重复多次。
  3. 如果噪点或者孤立点过多,考虑更换算法,如密度聚类

7、K-means是否会一直陷入选择质心的循环停不下来?

        不会,数学证明kmeans一定会收敛。大概思路是利用SSE的概念(也就是误差平方和),即每个点到自身所归属质心的距离的平方和,这个平方和是一个凸函数,通过迭代一定可以到达它的局部最优解。

代码可设置迭代次数,收敛判断距离等


8、如何快速收敛数据量超大的K-means?

        分批处理 mini batch

        
9、K-means算法的优点和缺点是什么?

优点:

  1. 原理简单,容易实现
  2. 调参只需调整一个K值参数
  3. 可解释性强

缺点:

  1. 对离群点和噪声点敏感。
  2. K值的选择很难确定。
  3. 初始值的选择对结果影响较大。
  4. 聚类结果可能是局部最优而非全局最优。
  5. kmeans处理不了非凸数据集。
  6. 如果两个类别距离比较近,结果可能也不好。


10、如何对K-means聚类效果进行评估?

轮廓系数

数据归一化

数据归一化/标准化的好处:

  1. 提升模型精度
  2. 提升收敛速度

标准化:(X-mean)/std

归一化:(X-min)/(max-min)

散点矩阵

散点图一般用于描述两个数值型变量之间的关系

散点矩阵解读:

  1. 对角线部分:表示第i个特征的分布,x为该特征的值,y轴为该特征的值出现的次数。表示第i个特征的密度估计
  2. 非对角线部分:第i个特征与第j个特征的散点图,描述两个特征之前的相关性

轮廓系数

聚类效果评估——轮廓系数(Silhouette Coefficient)附Python代码_NLP翟-CSDN博客_轮廓系数代码

评价聚类结果好坏的一种方式

  1. 对于簇中的每个向量,分别计算轮廓系数
  2. 将所有点的轮廓系数求平均就是聚类结果总的轮廓系数

DBSCAN算法

是一种基于密度的空间聚类算法

完整代码

import pandas as pd
from sklearn.cluster import KMeans
from pandas.plotting import scatter_matrix
import matplotlib.pyplot as plt
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn import metrics
# 加载数据
beer = pd.read_csv('E:\\ai\\main\\data.txt', sep=' ')
# 提取特征
X = beer[["calories", "sodium", "alcohol", "cost"]]

# kmeans聚类
# 设置聚类核心
km = KMeans(n_clusters=3).fit(X)
km2 = KMeans(n_clusters=2).fit(X)

# 聚类的结果作为标签
beer['cluster'] = km.labels_
beer['cluster2'] = km2.labels_
# 对比两种聚类
cluster_centers = km.cluster_centers_
cluster_centers_2 = km2.cluster_centers_
centers = beer.groupby("cluster").mean().reset_index()
# 画图对比
plt.rcParams['font.size'] = 14
colors = np.array(['red', 'green', 'blue', 'yellow'])
plt.scatter(beer["calories"], beer["alcohol"], c=colors[beer["cluster"]])
plt.scatter(centers.calories, centers.alcohol, linewidths=3, marker='+', s=300, c='black')
plt.xlabel("Calories")
plt.ylabel("Alcohol")
# 散点矩阵分析
scatter_matrix(beer[["calories", "sodium", "alcohol", "cost"]], s=100, alpha=1, c=colors[beer["cluster"]],
               figsize=(10, 10))
plt.suptitle("With 3 centroids initialized")
scatter_matrix(beer[["calories", "sodium", "alcohol", "cost"]], s=100, alpha=1, c=colors[beer["cluster2"]],
               figsize=(10, 10))
plt.suptitle("With 2 centroids initialized")

# 对数据进行缩放
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 缩放后的数据进行聚类
km3 = KMeans(n_clusters=3).fit(X_scaled)
beer["scaled_cluster"] = km3.labels_
beer.sort_values("scaled_cluster")
beer.groupby("scaled_cluster").mean()
pd.scatter_matrix(X, c=colors[beer.scaled_cluster], alpha=1, figsize=(10, 10), s=100)

# 聚类评估 轮廓系数
score_scaled = metrics.silhouette_score(X, beer.scaled_cluster)
score = metrics.silhouette_score(X, beer.cluster)
print(score_scaled, score)
scores = []
for k in range(2, 20):
    labels = KMeans(n_clusters=k).fit(X).labels_
    score = metrics.silhouette_score(X, labels)
    scores.append(score)
plt.plot(list(range(2, 20)), scores)
plt.xlabel("Number of Clusters Initialized")
plt.ylabel("Sihouette Score")

# DBSCAN聚类
from sklearn.cluster import DBSCAN

db = DBSCAN(eps=10, min_samples=2).fit(X)
labels = db.labels_
beer['cluster_db'] = labels
beer.sort_values('cluster_db')
beer.groupby('cluster_db').mean()
pd.scatter_matrix(X, c=colors[beer.cluster_db], figsize=(10, 10), s=100)
举报

相关推荐

0 条评论