0


AI - 聚类算法

😆😆😆感谢大家的观看😆😆😆

聚类算法概念

💥聚类算法是一种无监督学习方法,用于将数据集中的对象划分为若干个簇,使得同一个簇内的对象之间具有较高的相似性,而不同簇的对象之间具有较大的差异性

聚类算法的应用场景:

  • 商业选址:通过分析用户的地理位置信息,聚类算法可以帮助企业确定新店铺的最佳位置,以最大化覆盖潜在客户。
  • 客户画像:聚类算法能够根据客户的行为、偏好等数据将客户划分为不同的群体,从而帮助企业更好地理解目标市场,实现精准营销。
  • 社交网络分析:在社交网络中,聚类算法可以用于发现社区结构,即一组相互之间有紧密联系的用户群体。
  • 图像分割:在计算机视觉领域,聚类算法用于将图像中的像素点根据颜色或纹理特征分为不同的区域,以便进行进一步的图像处理。
  • 生物信息学:聚类算法在基因表达数据分析中应用广泛,可以帮助科学家发现功能相似的基因或蛋白质。
  • 市场细分:通过聚类分析消费者的购买行为和偏好,企业可以将市场细分为不同的部分,以便针对不同细分市场制定特定的产品和营销策略。
  • 文档聚类:在文本挖掘中,聚类算法可以用于自动对文档进行分类,将内容相似的文档归为一类,便于信息的检索和管理。
  • 异常检测:聚类算法还可以用于识别数据中的异常点,这些点可能代表欺诈行为、网络入侵或其他需要关注的事件。
  • 资源优化:在物流和供应链管理中,聚类算法可以帮助优化资源的分配,例如确定最佳的仓库位置或货物配送路线。

聚类算法因其能够在无监督的环境中发现数据的内在结构和模式,而在各个领域都有广泛的应用。选择合适的聚类算法和参数对于解决特定问题至关重要。这类方法通常需要预先指定簇的数量,并通过迭代优化来找到最佳的数据划分。典型的划分方法包括K-means算法、K-medoids算法等。这些算法通过最小化簇内对象与簇中心(或代表对象)的距离之和来实现数据的划分。

层次聚类不需要预先指定簇的数量,而是通过逐层合并或分裂数据对象来构建一个层次结构的聚类树形图。代表性的算法有AGNES(自底向上的聚合算法)和DIANA(自顶向下的分裂算法)。

聚类的定义

  • 一种典型的无监督学习算法
  • 主要用于将相似的样本自动归到一个类别中
  • 计算样本和样本之间的相似性,一般使用欧式距离

KMeans

sklearn.cluster.KMeans(n_clusters=8)

n_clusters:开始的聚类中心数量

estimator.fit(x)
estimator.predict(x)
estimator.fit_predict(x)# 相当于先调用fit(x),然后再调用predict(x)

案例

import matplotlib.pyplot as plt
from sklearn.datasets.samples_generator import make_blobs
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

# 创建数据集
# X为样本特征,Y为样本簇类别, 共1000个样本,每个样本2个特征
X, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1, -1], [0, 0], [1, 1], [2, 2]],
                  cluster_std=[0.4, 0.2, 0.2, 0.2],
                  random_state=9)

plt.scatter(X[:, 0], X[:, 1], marker='o')
plt.show()

y_pred = KMeans(n_clusters=2, random_state=9).fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()

# 用轮廓系数评估的聚类分数
print(silhouette_score(X, y_pred))

k-means聚类步骤

  1. 随机设置K个特征空间内的点作为初始的聚类中心
  2. 对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类中心点作为标记类别
  3. 接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平均值)
  4. 如果计算得出的新中心点与原中心点一样(质心不再移动),那么结束,否则重新进行第二步过程

聚类效果评估

💥误差平方和(SSE)

( SSE = \sum_{i=1}^{k}\sum_{p in C_{i}} \left| p-m_{i}\right|^{2} )。

其中,( C_{i} ) 是第 ( i ) 个簇,( p ) 是 ( C_{i} ) 中的样本点,( m_{i} ) 是 ( C_{i} ) 的质心(即 ( C_{i} ) 中所有样本的均值)。SSE 计算的是所有样本点到其所属簇的质心的距离平方和,这个指标反映了簇内样本点的紧密程度。在聚类分析中,SSE 的值越小,表示簇内样本点越紧密,聚类效果通常被认为越好。

💥肘部法(Elbow method)

对于n个点的数据集,迭代计算k from 1 to n,每次聚类完成后计算每个点到其所属的簇中心的距离的平方和;

平方和是会逐渐变小的,直到k==n时平方和为0,因为每个点都是它所在的簇中心本身。

当误差平方和(SSE)的下降率突然变缓时,这个点就是最佳的K值。

**💥轮廓系数法(Silhouette Coefficient) **

对于簇中的每个点,首先计算该点到同簇其他点的平均距离(称为a),然后计算该点到最近簇(非本簇)中所有点的平均距离(称为b)。轮廓系数s(i)就是(b - a) / max(a, b)。

轮廓系数的值介于[-1, 1]之间。当轮廓系数接近1时,表示该点远离相邻簇,说明聚类效果较好;当轮廓系数接近-1时,表示该点可能被错误地归类到了相邻的簇中,聚类效果较差;如果轮廓系数接近0,则说明该点位于两个相邻簇的交界处,聚类效果不明显。

  1. sse:误差平方和的值越小越好
  2. 肘部法:下降率突然变缓时即认为是最佳的k值
  3. SC系数:取值为[-1, 1],其值越大越好

特征降维

💥用于训练的数据集特征对模型的性能有着极其重要的作用。如果训练数据中包含一些不重要的特征,可能导致模型的泛化性能不佳。某些特征的取值较为接近,其包含的信息较少

降维 是指在某些限定条件下,降低特征个数

低方差过滤法

  1. 如果一个特征的方差很小,这意味着该特征在数据集中的取值变化不大,因此它对模型的预测能力贡献有限。
  2. 低方差过滤法通常与其他特征选择方法结合使用,如相关系数法、主成分分析(PCA)等,以达到更好的降维效果。

相关系数法

  1. 通过计算特征的相关系数,发现具有相关性的特征,根据其相关性的强弱,可以选择特征。
  2. 皮尔逊相关系数
  3. 斯皮尔曼相关系数

PCA(主成分分析)降维法

  1. 保留大部分信息的前提下,将数据的维度压缩为到低维
  2. 在降维过程中能够去除特征之间的相关性

低方差过滤法

transformer = VarianceThreshold(threshold=0.1)
data = transformer.fit_transform(data)
print(data.shape)

删除方差低于 threshold 的特征将被删除,默认值是保留所有非零方差特征。

**主成分分析法 **

from sklearn.decomposition import PCA
from sklearn.datasets import load_iris

if __name__ == '__main__':

    
    x, y = load_iris(return_X_y=True)
    print(x[:5])

    # 保留指定比例的信息
    transformer = PCA(n_components=0.95)
    x_pca = transformer.fit_transform(x)
    print(x_pca[:5])

    # 保留指定数量特征
    transformer = PCA(n_components=2)
    x_pca = transformer.fit_transform(x)
    print(x_pca[:5])

聚类分析案例

import pandas as pd
dataset = pd.read_csv('data.csv')

from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters = 5, init = 'k-means++', random_state = 42)
y_kmeans = kmeans.fit_predict(X)
# 聚类数为5,init='k-means++'表示使用k-means++算法进行初始化
# random_state=42用于设置随机种子以确保结果的可重复性

# K-means算法最开始随机选取数据集中K个点作为聚类中心
'''K-means++假设已经选取了n个初始聚类中心,则在选取n+1个聚类中心时距离当前n个聚类中心越远的点会有更高的概率被选为第n+1个聚类中心。'''

import matplotlib.pyplot as plt
wcss = []
for i in range(1, 11): #循环使用不同k测试结果
    kmeans = KMeans(n_clusters = i, init = 'k-means++', random_state = 42)
    kmeans.fit(X)
    wcss.append(kmeans.inertia_) #inertia簇内误差平方和
plt.plot(range(1, 11), wcss)
plt.title('The Elbow Method')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()

K-Means在算法稳定性、效率和准确率(相对于真实标签的判别)上表现非常好,并且在应对大量数据时依然如此。它的算法时间复杂度上界为O(n * k * t),其中n是样本量、k是划分的聚类数、t是迭代次数。

选择K值时如果数据分布较为均匀,那么可以选择较小的k值;如果数据分布较为复杂,那么可能需要选择较大的k值。数据量也是影响k值选择的一个重要因素。数据量越大,通常可以容忍更大的k值。肘部法则是一种常用的选择k值的方法。通过计算不同k值下的簇内误差平方和(SSE),并绘制成图,可以找到曲线的“肘部”,即最佳的k值。

在实际项目中,可以通过交叉验证等方法来验证不同k值下模型的性能,从而选择合适的k值。


本文转载自: https://blog.csdn.net/qq_64685283/article/details/136798498
版权归原作者 小森( ﹡ˆoˆ﹡ ) 所有, 如有侵权,请联系我们删除。

“AI - 聚类算法”的评论:

还没有评论