python音频聚类_Python之聚类(KMeans,KMeans++)

这篇博客通过Python演示了如何使用KMeans和KMeans++进行聚类分析,特别是在处理音频数据时的效果。首先,生成了不同分布的数据集,然后应用KMeans和KMeans++进行聚类,并通过可视化展示了数据的原始分布和聚类结果,包括旋转后的数据和方差、数量不均衡的数据。最后,讨论了数据分布对KMeans聚类的影响。
摘要由CSDN通过智能技术生成

1 #-*- coding: utf-8 -*-

2 """

3 Created on Mon Sep 17 16:41:46 20184

5 @author: zhen6 """

7

8 importnumpy as np9 importmatplotlib.pyplot as plt10 importsklearn.datasets as ds11 importmatplotlib.colors12 from sklearn.cluster importKMeans13 from sklearn.cluster importMiniBatchKMeans14

15 defexpand(a, b):16 d = (b - a) * 0.1

17 return a-b, b+d18

19 if __name__ == "__main__":20 N = 400

21 centers = 4

22 data, y = ds.make_blobs(N, n_features=2, centers=centers, random_state=2)23 data2, y2 = ds.make_blobs(N, n_features=2, centers=centers, cluster_std=(1, 2.5, 0.5, 2), random_state=2)24 #按行拼接numpy数组

25 data3 = np.vstack((data[y == 0][:], data[y == 1][:50], data[y == 2][:20], data[y == 3][:5]))26 y3 = np.array([0] * 100 + [1] * 50 + [2] * 20 + [3] * 5)27 cls = KMeans(n_clusters=4, init='k-means++')28 y_hat =cls.fit_predict(data)29 y2_hat =cls.fit_predict(data2)30 y3_hat =cls.fit_predict(data3)31

32 m = np.array(((1, 1),(1, 3)))33 data_r =data.dot(m)34 y_r_hat =cls.fit_predict(data_r)35

36 matplotlib.rcParams['font.sans-serif'] = [u'SimHei']37 matplotlib.rcParams['axes.unicode_minus'] =False38 cm = matplotlib.colors.ListedColormap(list('rgbm'))39 plt.figure(figsize=(9, 10), facecolor='w')40 plt.subplot(421)41 plt.title(u'原始数据')42 plt.scatter(data[:, 0], data[:, 1], c=y, s=30, cmap=cm, edgecolors='none')43 x1_min, x2_min = np.min(data, axis=0)44 x1_max, x2_max = np.max(data, axis=0)45 x1_min, x1_max =expand(x1_min, x1_max)46 x2_min, x2_max =expand(x2_min, x2_max)47 plt.xlim((x1_min, x1_max))48 plt.ylim((x2_min, x2_max))49 plt.grid(True)50

51 plt.subplot(422)52 plt.title(u'KMeans++聚类')53 plt.scatter(data[:, 0], data[:, 1], c=y_hat, s=30, cmap=cm, edgecolors='none')54 plt.xlim((x1_min, x1_max))55 plt.ylim((x2_min, x2_max))56 plt.grid(True)57

58 plt.subplot(423)59 plt.title(u'旋转后数据')60 plt.scatter(data[:, 0], data[:, 1], c=y, s=30, cmap=cm, edgecolors='none')61 #x1_min, x2_min = np.min(data_r, axis=0)

62 #x1_max, x2_max = np.max(data_r, axis=0)

63 #x1_min, x1_max = expand(x1_min, x1_max)

64 #x2_min, x2_max = expand(x2_min, x2_max)

65 plt.ylim((x1_min, x1_max))66 plt.xlim((x2_min, x2_max))67 plt.grid(True)68

69 plt.subplot(424)70 plt.title(u'旋转后KMeans++聚类')71 plt.scatter(data[:, 0], data[:, 1], c=y_hat, s=30, cmap=cm, edgecolors='none')72 plt.ylim((x1_min, x1_max))73 plt.xlim((x2_min, x2_max))74 plt.grid(True)75

76 plt.subplot(425)77 plt.title(u'方差不相等数据')78 plt.scatter(data2[:, 0], data2[:, 1], c=y2, s=30, cmap=cm, edgecolors='none')79 #x1_min, x2_min = np.min(data2, axis=0)

80 #x1_max, x2_max = np.max(data2, axis=0)

81 #x1_min, x1_max = expand(x1_min, x1_max)

82 #x2_min, x2_max = expand(x2_min, x2_max)

83 plt.xlim((x1_min, x1_max))84 plt.ylim((x2_min, x2_max))85 plt.grid(True)86

87 plt.subplot(426)88 plt.title(u'方差不相等KMeans++聚类')89 plt.scatter(data2[:, 0], data2[:, 1], c=y2_hat, s=30, cmap=cm, edgecolors='none')90 plt.xlim((x1_min, x1_max))91 plt.ylim((x2_min, x2_max))92 plt.grid(True)93

94 plt.subplot(427)95 plt.title(u'数量不相等数据')96 plt.scatter(data3[:, 0], data3[:, 1], c=y3, s=30, cmap=cm, edgecolors='none')97 #x1_min, x2_min = np.min(data3, axis=0)

98 #x1_max, x2_max = np.max(data3, axis=0)

99 #x1_min, x1_max = expand(x1_min, x1_max)

100 #x2_min, x2_max = expand(x2_min, x2_max)

101 plt.xlim((x1_min, x1_max))102 plt.ylim((x2_min, x2_max))103 plt.grid(True)104

105 plt.subplot(428)106 plt.title(u'数量不相等KMeans++聚类')107 plt.scatter(data3[:, 0], data3[:, 1], c=y3_hat, s=30, cmap=cm, edgecolors='none')108 plt.xlim((x1_min, x1_max))109 plt.ylim((x2_min, x2_max))110 plt.grid(True)111

112 plt.tight_layout(2, rect=(0, 0, 1, 0.97))113 plt.suptitle(u'数据分布对KMeans聚类的影响', fontsize=18)114 plt.show()115

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
K-means是常用的聚类算法之一,它的主要思想是将数据点分为K个簇,使得同一簇内的点相似度较高,不同簇之间的点相似度较低。在scikit-learn中,KMeans聚类算法已经实现,可以方便地进行聚类操作。 本文将介绍使用scikit-learn中的KMeans聚类算法进行聚类的步骤和实现方法,并介绍MiniBatchKMeans的使用。 ## 1. 数据准备 我们先生成一个随机数据集,用于演示KMeans聚类: ```python import numpy as np # 生成随机数据 np.random.seed(0) X = np.random.randn(1000, 2) # 生成1000个二维数据点 ``` ## 2. 模型训练 接下来,我们使用KMeans模型对数据进行聚类: ```python from sklearn.cluster import KMeans # 构建模型 kmeans = KMeans(n_clusters=3, random_state=0) # 训练模型 kmeans.fit(X) ``` 这里选择将数据分为3个簇,可以根据实际情况进行调整。训练完成后,我们可以查看簇中心点的位置: ```python print(kmeans.cluster_centers_) ``` 输出: ``` [[ 0.05161133 -0.96525049] [ 1.06359705 -0.02646225] [-0.9680658 0.04252211]] ``` ## 3. 预测和评估 训练完成后,我们可以使用训练好的模型对新数据进行预测: ```python # 预测新数据 y_pred = kmeans.predict(X) ``` 对于聚类算法,我们可以使用轮廓系数(Silhouette Coefficient)评估聚类效果。轮廓系数是一种衡量聚类质量的指标,取值范围在[-1, 1]之间,越接近1表示聚类效果越好。在scikit-learn中,可以使用metrics.silhouette_score来计算轮廓系数: ```python from sklearn import metrics # 计算轮廓系数 score = metrics.silhouette_score(X, y_pred) print(score) ``` 输出: ``` 0.6011942331016043 ``` ## 4. MiniBatchKMeans KMeans聚类算法的一个问题是它对于大规模数据聚类会比较慢。因此,scikit-learn中还提供了MiniBatchKMeans算法,它可以加快聚类速度。 MiniBatchKMeans的使用方法与KMeans类似: ```python from sklearn.cluster import MiniBatchKMeans # 构建模型 mbkmeans = MiniBatchKMeans(n_clusters=3, random_state=0) # 训练模型 mbkmeans.fit(X) # 预测新数据 y_pred = mbkmeans.predict(X) # 计算轮廓系数 score = metrics.silhouette_score(X, y_pred) print(score) ``` 需要注意的是,MiniBatchKMeans算法在聚类效果上可能会稍微劣于KMeans算法,但是速度更加快捷。在处理大规模数据时,可以优先考虑使用MiniBatchKMeans算法。 本文介绍了使用scikit-learn中的KMeans聚类算法进行聚类的步骤和实现方法,并介绍了MiniBatchKMeans的使用。在实际应用中,可以根据实际情况选择不同的聚类算法和参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值