• K-means和DBSCAN


    目录

    一、K-means和DBSCAN之间的主要区别

    二、DBSCAN聚类算法

    2.1DBSCAN聚类算法实现点集数据的聚类

    2.2DBSCAN聚类算法实现鸢尾花数据集的聚类

    三、K-means聚类算法

    3.1K-means聚类算法实现随机数据的聚类

    3.2K-means聚类算法实现鸢尾花数据集的聚类


    一、K-means和DBSCAN之间的主要区别

    1.聚类原理:

            K-means:K-means是一种基于距离的聚类算法,它将数据点划分为K个簇,通过最小化数据点与所属簇的质心之间的平方距离来确定聚类结果。K-means假设聚类簇为凸形,并且簇的大小差异较小。

            DBSCAN:DBSCAN是一种基于密度的聚类算法,它通过确定数据点的密度来划分聚类。DBSCAN将高密度区域视为聚类,并能够识别出噪声点和孤立点。相比于K-means,DBSCAN对聚类簇的形状没有预设要求,可以发现任意形状的聚类簇。

    2.聚类数量:

            K-means:K-means需要预先指定聚类的数量K。这是因为K-means是一个划分式聚类方法,需要事先确定聚类簇的数量,然后将数据点划分为K个簇。

            DBSCAN:DBSCAN不需要预先指定聚类的数量。它根据数据点的密度来决定聚类的形状和数量,可以自动发现不同大小和形状的聚类簇。

    3.处理噪声和孤立点:

            K-means:K-means对噪声和孤立点敏感。它会将这些数据点分配到离它们最近的聚类簇中,即使这些数据点在实际中并不属于任何簇。

            DBSCAN:DBSCAN能够有效地处理噪声和孤立点。它将这些数据点标记为噪声或边界点,不归属于任何聚类簇。

    4.参数选择:

            K-means:K-means需要事先指定聚类的数量K,这需要一定的先验知识或通过试验和评估来确定最佳的K值。

            DBSCAN:DBSCAN需要调整两个关键参数:领域半径(eps)和最小样本数(min_samples)。这些参数的选择可以影响聚类结果,需要根据数据集的特点进行调优。

    二、DBSCAN聚类算法

    2.1DBSCAN聚类算法实现点集数据的聚类

    代码:

    1. from sklearn import datasets
    2. import numpy as np
    3. import random
    4. import matplotlib.pyplot as plt
    5. import time
    6. import copy
    7. def find_neighbor(j, x, eps):
    8. N = list()
    9. for i in range(x.shape[0]):
    10. temp = np.sqrt(np.sum(np.square(x[j] - x[i]))) # 计算欧式距离
    11. if temp <= eps:
    12. N.append(i)
    13. return set(N)
    14. def DBSCAN(X, eps, min_Pts):
    15. k = -1
    16. neighbor_list = [] # 用来保存每个数据的邻域
    17. omega_list = [] # 核心对象集合
    18. gama = set([x for x in range(len(X))]) # 初始时将所有点标记为未访问
    19. cluster = [-1 for _ in range(len(X))] # 聚类
    20. for i in range(len(X)):
    21. neighbor_list.append(find_neighbor(i, X, eps))
    22. if len(neighbor_list[-1]) >= min_Pts:
    23. omega_list.append(i) # 将样本加入核心对象集合
    24. omega_list = set(omega_list) # 转化为集合便于操作
    25. while len(omega_list) > 0:
    26. gama_old = copy.deepcopy(gama)
    27. j = random.choice(list(omega_list)) # 随机选取一个核心对象
    28. k = k + 1
    29. Q = list()
    30. Q.append(j)
    31. gama.remove(j)
    32. while len(Q) > 0:
    33. q = Q[0]
    34. Q.remove(q)
    35. if len(neighbor_list[q]) >= min_Pts:
    36. delta = neighbor_list[q] & gama
    37. deltalist = list(delta)
    38. for i in range(len(delta)):
    39. Q.append(deltalist[i])
    40. gama = gama - delta
    41. Ck = gama_old - gama
    42. Cklist = list(Ck)
    43. for i in range(len(Ck)):
    44. cluster[Cklist[i]] = k
    45. omega_list = omega_list - Ck
    46. return cluster
    47. X1, y1 = datasets.make_circles(n_samples=2000, factor=.6, noise=.02)
    48. X2, y2 = datasets.make_blobs(n_samples=400, n_features=2, centers=[[1.2, 1.2]], cluster_std=[[.1]], random_state=9)
    49. X = np.concatenate((X1, X2))
    50. eps = 0.08
    51. min_Pts = 10
    52. begin = time.time()
    53. C = DBSCAN(X, eps, min_Pts)
    54. end = time.time()
    55. plt.figure()
    56. plt.scatter(X[:, 0], X[:, 1], c=C)
    57. plt.show()

    结果:

    2.2DBSCAN聚类算法实现鸢尾花数据集的聚类

    代码:

    1. import numpy as np
    2. import matplotlib.pyplot as plt
    3. from sklearn.datasets import load_iris
    4. from sklearn.cluster import DBSCAN
    5. from sklearn.decomposition import PCA
    6. # 加载鸢尾花数据集
    7. iris = load_iris()
    8. X = iris.data
    9. # 使用PCA进行数据降维
    10. pca = PCA(n_components=2)
    11. X_pca = pca.fit_transform(X)
    12. # 使用DBSCAN进行聚类
    13. dbscan = DBSCAN(eps=0.4, min_samples=3)
    14. labels = dbscan.fit_predict(X_pca)
    15. # 绘制聚类结果
    16. plt.scatter(X_pca[:, 0], X_pca[:, 1], c=labels)
    17. plt.xlabel('Principal Component 1')
    18. plt.ylabel('Principal Component 2')
    19. plt.title('DBSCAN Clustering on Iris Dataset')
    20. plt.show()

    结果:

    三、K-means聚类算法

    3.1K-means聚类算法实现随机数据的聚类

    代码:

    1. import torch
    2. import math
    3. import matplotlib.pyplot as plt
    4. def dis(a, b):
    5. return math.sqrt((a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]))
    6. X = torch.randn(2000) * 100
    7. y = torch.randn(2000) * 100
    8. C = torch.zeros(2000)
    9. K = 5
    10. CentPoint = []
    11. for i in range(K):
    12. CentPoint.append([torch.randint(-100, 100, (1,)).item(),
    13. torch.randint(-100, 100, (1,)).item()])
    14. print(CentPoint)
    15. for p in range(10):
    16. NewPoint = [[0, 0] for i in range(K)]
    17. for i in range(len(X)):
    18. mDis = 1e9
    19. mC = 0
    20. for j in range(len(CentPoint)):
    21. cp = CentPoint[j]
    22. D = dis([X[i].item(), y[i].item()], cp)
    23. if mDis > D:
    24. mDis = D
    25. mC = j
    26. C[i] = mC
    27. NewPoint[mC][0] += X[i].item()
    28. NewPoint[mC][1] += y[i].item()
    29. for i in range(K):
    30. CentPoint[i][0] = NewPoint[i][0] / 2000
    31. CentPoint[i][1] = NewPoint[i][1] / 2000
    32. print(CentPoint)
    33. cc = list(C)
    34. for i in range(len(X)):
    35. if cc[i] == 0:
    36. plt.plot(X[i].item(), y[i].item(), 'r.')
    37. elif cc[i] == 1:
    38. plt.plot(X[i].item(), y[i].item(), 'g.')
    39. elif cc[i] == 2:
    40. plt.plot(X[i].item(), y[i].item(), 'b.')
    41. elif cc[i] == 3:
    42. plt.plot(X[i].item(), y[i].item(), color='pink', marker='.')
    43. elif cc[i] == 4:
    44. plt.plot(X[i].item(), y[i].item(), color='orange', marker='.')
    45. for CP in CentPoint:
    46. plt.plot(CP[0], CP[1], color='black', marker='X')
    47. plt.show()

    3.2K-means聚类算法实现鸢尾花数据集的聚类

    代码:

    1. import numpy as np
    2. import matplotlib.pyplot as plt
    3. from sklearn.datasets import load_iris
    4. from sklearn.cluster import KMeans
    5. from sklearn.decomposition import PCA
    6. # 加载鸢尾花数据集
    7. iris = load_iris()
    8. X = iris.data
    9. # 使用PCA进行数据降维
    10. pca = PCA(n_components=2)
    11. X_pca = pca.fit_transform(X)
    12. # 使用K-means进行聚类
    13. kmeans = KMeans(n_clusters=3, random_state=0)
    14. labels = kmeans.fit_predict(X_pca)
    15. # 绘制聚类结果
    16. plt.scatter(X_pca[:, 0], X_pca[:, 1], c=labels)
    17. plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], marker='x', color='red', label='Centroids')
    18. plt.xlabel('Principal Component 1')
    19. plt.ylabel('Principal Component 2')
    20. plt.title('K-means Clustering on Iris Dataset')
    21. plt.legend()
    22. plt.show()

    结果:

  • 相关阅读:
    并购事件是什么?
    林业草原防火智能可视化平台
    influxdb2的使用
    C#捕捉全局异常
    Vue3的升级及优化总结
    Python【数据分析第二阶段测试】
    react-navigation v6版本的一些使用技巧
    GAN的理论知识及公式的理解
    怎样判定一个可执行文件是否是PIE 格式的文件
    JS 多字段拼接为字符串,并处理掉 null 的情况
  • 原文地址:https://blog.csdn.net/weixin_47151388/article/details/137950257