聚类是一种无监督学习方法,它的目的是将数据集中的数据点划分为若干个相似的子集,称为聚类。
常用聚类方法介绍
常用的聚类方法有以下几种:1.基于划分的聚类:这种方法将数据点划分为k个预先给定的簇,使得每个簇内部的数据点尽可能相似,而不同簇之间的数据点尽可能不同。代表性的算法有k-means、k-medoids、k-modes等。2.基于层次的聚类:这种方法将数据点按照层次结构进行划分,可以得到不同层次和粒度的聚类结果。代表性的算法有凝聚型层次聚类(自底向上)和分裂型层次聚类(自顶向下)。3.基于密度的聚类:这种方法将密度高且连续的数据点划分为一个簇,而忽略密度低或孤立的数据点。代表性的算法有DBSCAN、OPTICS、DENCLUE等。4.基于网格的聚类:这种方法将数据空间划分为若干个网格单元,然后对每个网格单元进行统计和评估,从而得到具有高密度或特定形状的网格单元组成的簇。代表性的算法有STING、CLIQUE、WaveCluster等。5.基于模型的聚类:这种方法假设每个簇都服从某种概率模型或函数模型,并根据最小化误差等原则来确定模型参数和簇划分。代表性的算法有高斯混合模型、谱聚类、神经网络等。
代码实现
k-means聚类
这里我先使用k-means算法,它的基本思想是:给定一个数据集和一个预先设定的簇数k,首先随机选择k个数据点作为初始簇中心,然后计算每个数据点到各个簇中心的距离,并将其分配到最近的簇中心所在的簇,接着更新每个簇的中心为该簇内所有数据点的均值,重复这个过程直到簇中心不再变化或达到最大迭代次数。下面是用python实现k-means算法的代码:
# 导入库 import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.datasets import make_blobs # 使用make_blobs函数生成一个有四个簇的数据集,每个簇有100个观测值和两个特征 X, y = make_blobs(n_samples=400, n_features=2, centers=4) # 可视化生成的数据集,以第一个特征和第二个特征为例 plt.scatter(X[:, 0], X[:, 1]) plt.xlabel("feature_1") plt.ylabel("feature_2") plt.show() # 使用K-means算法对数据进行聚类,假设有四个簇 kmeans = KMeans(n_clusters=4) # 训练模型并得到每个观测值的簇标签 kmeans.fit(X) labels = kmeans.predict(X) # 可视化聚类结果,以第一个特征和第二个特征为例,并用不同颜色表示不同簇 plt.scatter(X[:, 0], X[:, 1], c=labels, cmap="rainbow") plt.xlabel("feature_1") plt.ylabel("feature_2") plt.show()
经纬度坐标数据,也可以使用K-means算法对它们进行聚类,如果需要更精确可以调整为导航距离数据。
# 导入库 import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans # 创建一些坐标数据,每个坐标由纬度和经度组成 coordinates = [[40.7128, -74.0060], [34.0522, -118.2437], [41.8781, -87.6298], [29.7604, -95.3698], [39.9526, -75.1652], [48.8566, 2.3522], [51.5074, -0.1278], [52.5200, 13.4050], [55.7558, 37.6173], [35.6895, 139.6917]] # 将坐标数据转换为一个二维数组 X = np.array(coordinates) # 使用K-means算法对坐标数据进行聚类,假设有两个簇 kmeans = KMeans(n_clusters=2) # 训练模型并得到每个坐标的簇标签 kmeans.fit(X) labels = kmeans.predict(X) # 可视化聚类结果,以纬度和经度为例,并用不同颜色表示不同簇 plt.scatter(X[:, 0], X[:, 1], c=labels, cmap="rainbow") plt.xlabel("latitude") plt.ylabel("longitude") plt.show()
K-means算法有以下优缺点。1.优点:简单、灵活、高效;容易调整参数和解释结果;适用于大规模数据集和高维特征;可以发现隐藏在数据中的模式。2.缺点:需要提前指定K值,但并不总是容易知道有多少个簇合适;对初始簇中心和噪声敏感,可能导致不稳定或局部最优的结果;假设每个簇是球形且具有相似大小和密度,但实际数据可能不符合这些假设;可能无法处理非线性可分或自然不平衡的数据;
DBSCAN密度聚类算法。
密度聚类是一种基于样本分布的紧密程度来确定聚类结构的算法。它从样本密度的角度来考察样本之间的可连接性,并通过可连接性不断扩展聚类簇来获得最终的聚类结果。密度聚类的原理和步骤大致如下: 定义一个邻域半径ε和一个最小点数MinPts,用于判断一个点是否为核心点。对每个点,计算其ε邻域内的点数,如果大于或等于MinPts,则该点为核心点,否则为边界点或噪声点。对每个核心点,找出其直接密度可达的点,即在其ε邻域内且也是核心点的其他点。递归地找出所有直接密度可达的核心点,并将它们连接起来形成一个最大密度相连集合,即一个聚类簇。重复上述步骤,直到所有核心点都被分配到某个聚类簇中,或者没有更多的核心点存在。
from sklearn.cluster import DBSCAN from sklearn.datasets import make_moons import matplotlib.pyplot as plt # 生成月牙形数据 X, y = make_moons(n_samples=200, noise=0.05) # 创建DBSCAN对象,设置参数eps=0.3, min_samples=5 dbscan = DBSCAN(eps=0.3, min_samples=5) # 对数据进行聚类 dbscan.fit(X) # 获取聚类标签 labels = dbscan.labels_ # 绘制聚类结果 plt.scatter(X[:, 0], X[:, 1], c=labels) plt.show()
# 导入库 import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import DBSCAN # 生成随机数据 X = np.random.randn(1000, 2) # 设置DBSCAN算法参数 eps = 0.3 # 邻域半径 MinPts = 10 # 密度阈值 # 创建DBSCAN对象并进行聚类 dbscan = DBSCAN(eps=eps, min_samples=MinPts) dbscan.fit(X) # 获取聚类标签和核心样本索引 labels = dbscan.labels_ core_indices = dbscan.core_sample_indices_ # 绘制聚类结果图 plt.figure(figsize=(8, 6)) plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='rainbow') plt.scatter(X[core_indices, 0], X[core_indices, 1], marker='o', s=80, edgecolor='k', facecolor='none', label='Core points') plt.xlabel('X1') plt.ylabel('X2') plt.title('DBSCAN clustering result') plt.legend() plt.show()
1.DBSCAN聚类算法有以下优点:可以发现任意形状的聚类,不受球形假设的限制。可以识别噪声点,并将其从聚类中排除。不需要指定聚类的个数,只需要设置邻域半径和密度阈值。可以处理高维数据,具有较好的可伸缩性。2.DBSCAN算法有以下缺点:对于不同密度的数据集,可能难以选择合适的邻域半径和密度阈值。对于边界点,可能会因为访问顺序的不同而被分配到不同的簇中。对于高维数据,可能难以找到合适的距离度量方法。