数据挖掘十大经典算法(二)---K-Means

简介

K-Means是一种常用的非监督式聚类算法,其中k代表聚类的类别数量,means代表均值。是基于划分的聚类算法,对象之间的相似度使用距离来衡量。

算法步骤:

1)选取k个数据作为初始聚类中心(可以随机选取也可以指定);

2)对其余数据计算与k个聚类中心的距离,并归类在距离最小的聚类中心所代表的类中;

3)重新计算每个类簇的中心,(计算每个类簇中对象的均值);

4)计算准则函数,重复2)、3)直到准则函数不再发生变化(收敛);

聚类数量k的选取

算法中聚类的数量需要人为指定,当k值较大时,聚类效果好,但是时间消耗快;当k值较小时,聚类结果单调。k值的大小也与数据量的大小有关系。《大数据》中提到:给定一个合适的类簇指标,比如平均半径或直径,只要我们假设的类簇的数目等于或者高于真实的类簇的数目时,该指标上升会很缓慢,而一旦试图得到少于真实数目的类簇时,该指标会急剧上升。(类簇的直径是指类簇内任意两点之间的最大距离。类簇的半径是指类簇内所有点到类簇中心距离的最大值)

确定聚类的数量通常有两种方式:

1、手肘法

核心指标为SSE(sum of squared errors,误差平方和),,Ci是第i个簇,p是Ci中的样本点,mi是Ci的质心(Ci中所有样本的均值),SSE是所有样本的聚类误差,代表了聚类效果的好坏。

核心思想为:随着聚类数量的增大,数据集被划分的更加精细,每个类簇的聚合程度会逐渐提高,那么误差平方和SSE就会逐渐变小。当k小于真实类簇的数目时,K值的增大会大幅增加每个簇的聚合程度,SSE的下降幅度会很大;当k值大于等于真实类簇数目时,增加k会使类的聚合程度回报迅速变小,则SSE的下降幅度减慢,最后随着k值的增大而逐渐趋于平缓;所以k值和SSE的关系图会有一个转折点,即为真实类簇的数目。

2、轮廓系数法

核心指标为轮廓系数(Silhouette Coefficient),,a是Xi与同簇的其他样本的平均距离,称为凝聚度,b是Xi与最近簇中所有样本的平均距离,称为分离度。最近簇的定义是,p是某个簇Ck中的样本。事实上,简单点讲,就是用Xi到某个簇所有样本平均距离作为衡量该点到该簇的距离后,选择离Xi最近的一个簇作为最近簇。求出所有样本的轮廓系数后取平均值得到平均轮廓系数,其取值范围为【-1,1】,簇内样本的距离越近,簇间样本的距离越远,则轮廓系数越大,聚类效果越好。所以在选取中,要选择轮廓系数最大的k值作为聚类数量的初始值。

初始聚类中心的选取

在确定聚类数量之后,需要在数据集中选取k个初始的聚类中心。最简单的方法是随机选取,但是其聚类效果不够理想。还有以下两种方式可供使用:

1)选择彼此距离尽可能远的k个点:首先随机选择一个点作为第一个初始类簇中心点,然后选择距离该点最远的那个点作为第二个初始类簇中心点,然后再选择距离前两个点的最近距离最大的点作为第三个初始类簇的中心点,以此类推,直至选出K个初始类簇中心点。

2)先使用层次聚类或者canopy算法进行聚类,将得到的类簇中心作为初始类簇中心点:

相似性度量

该算法中数据对象之间的相似性通常采用距离进行度量,最常使用的是欧氏距离,也可以采用曼哈顿距离,巴氏距离等。

性能分析

优点:简单、高效;对处理大数据集,该算法相对可伸缩且高效率,它的复杂度大约为o(nkt),其中n为全部对象的数目,k是类簇的数目,t是迭代的次数,(k<<n),算法通常以局部最优结束;由于试图找出是平方误差函数值最小的k个划分。使用于密集的球状或团状簇,簇之间的差别特别明显时,聚类效果较好;

缺点:仅仅适用于簇的平均值被定义的情况,不适用于涉及分类属性的数据;需要实现确定类簇的数目k;对初值敏感,不同的初值会产生不同的聚类效果;不适用于发现非凸面形状或者大小区别非常大的类簇;对于噪声和孤立点数据敏感,少量的该类数据可以对平均值产生极大的影响。

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<h3>回答1:</h3><br/>以下是使用Python编写的K-means算法数据挖掘第十章习题的代码: ``` import numpy as np from matplotlib import pyplot as plt from sklearn.cluster import KMeans %matplotlib inline # 生成随机数据 num_points = 200 num_clusters = 4 x, y = [], [] for i in range(num_points): if np.random.random() > 0.5: x.append(np.random.normal(0.0, 0.9)) y.append(np.random.normal(0.0, 0.9)) else: x.append(np.random.normal(3.0, 0.5)) y.append(np.random.normal(1.0, 0.5)) data = np.column_stack((x, y)) # 执行k-means算法 kmeans = KMeans(n_clusters=num_clusters, init='k-means++', max_iter=100, n_init=1, verbose=0) kmeans.fit(data) # 绘制聚类结果 colors = ['b', 'g', 'r', 'c', 'm', 'y', 'k'] for i in range(num_points): plt.scatter(data[i, 0], data[i, 1], s=30, color=colors[kmeans.labels_[i]]) plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], marker='x', s=200, linewidths=3, color='k') plt.show() ``` 该代码用于生成随机数据,并执行K-means算法进行聚类。最终绘制聚类结果,并以黑色十字形显示聚类中心点。可以通过修改随机数据的生成方式、聚类数目、算法参数等,来测试不同的聚类效果。 <h3>回答2:</h3><br/>K-means算法是一种常用的基于聚类的数据挖掘算法,可以对无标签数据进行聚类分析,本章中介绍了K-means算法的原理及其python代码实现。代码如下: ``` python import numpy as np import pandas as pd import matplotlib.pyplot as plt # 生成数据集 def create_datset(k, n): data = [] for i in range(k): init_center = np.random.randint(0, 30, size=2) x = np.random.normal(init_center[0], 1, size=(n, 2)) data.append(x) return np.vstack(data) # 计算欧氏距离 def distance(x, center): diffs = x - center return np.sqrt(np.sum(diffs ** 2, axis=1)) # k-means算法 def k_means(data, k, max_iter=100): # 随机初始化k个中心点 centers = data[np.random.choice(data.shape[0], k, replace=False)] for i in range(max_iter): # 计算每个样本距离最近的中心点 labels = np.argmin([distance(data, center) for center in centers], axis=0) # 更新中心点位置 new_centers = [data[labels == j].mean(axis=0) for j in range(k)] # 判断聚类是否已经收敛,如果已经收敛则退出循环 if np.all(centers == new_centers): break centers = new_centers return centers, labels # 显示聚类结果 def plot_clusters(data, labels, centers): plt.scatter(data[:, 0], data[:, 1], c=labels, s=50, alpha=0.5) plt.scatter(centers[:, 0], centers[:, 1], marker='*', c='r', s=100, alpha=0.5) plt.show() if __name__ == '__main__': data = create_datset(k=3, n=100) centers, labels = k_means(data, k=3) plot_clusters(data, labels, centers) ``` 代码中首先生成了一个带有3个簇的数据集,然后通过k_means()函数实现了K-means算法的聚类过程,最后使用plot_clusters()函数将聚类结果可视化展示了出来。 K-means算法的python实现代码较为简单,但需要注意一些细节问题。例如,在实现距离计算时,我们可以使用numpy中的sum()函数,但此时需要指定axis参数,否则无法正确计算每个样本距离每个中心点的距离;在更新中心点位置时,需要注意对样本进行筛选以避免无效计算;同时,在K-means算法的循环过程中,需要判断聚类是否已经收敛,并根据需要设置收敛的迭代次数。 <h3>回答3:</h3><br/>k-means算法是一种常用的聚类算法,在数据挖掘中得到广泛应用。它的原理简单,是一种迭代算法,不断将数据点分配到离它最近的中心点所在的簇,然后重新计算每个簇的中心点,直到满足停止条件为止。以下是k-means算法的python代码。 首先,需要导入必要的库和数据集。常用的数据集有iris、wine、digits等。在这里以iris数据集为例。代码如下: ```python from sklearn.datasets import load_iris from sklearn.cluster import KMeans iris = load_iris() X = iris.data ``` 确定簇的个数k,本例中将k设为3。 ```python k = 3 ``` 实例化k-means算法模型,并设置参数。n_clusters为簇的个数,init表示初始化的方法,k-means++为默认值,max_iter表示最大的迭代次数,n_init为选取不同的初始化方式运行k-means算法的次数,verbose表示是否输出冗长的进度信息。 ```python kmeans = KMeans(n_clusters=k, init='k-means++', max_iter=100, n_init=10, verbose=0) ``` 训练模型并进行预测。 ```python pred = kmeans.fit_predict(X) ``` 最后,可视化聚类结果。 ```python import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 以三个特征为坐标轴画图 fig = plt.figure(1, figsize=(8, 6)) ax = Axes3D(fig, elev=-150, azim=110) ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=pred, cmap=plt.cm.Set1, edgecolor='k', s=40) ax.set_title("iris 3D clustering") ax.set_xlabel("feature 1") ax.w_xaxis.set_ticklabels([]) ax.set_ylabel("feature 2") ax.w_yaxis.set_ticklabels([]) ax.set_zlabel("feature 3") ax.w_zaxis.set_ticklabels([]) plt.show() ``` 以上是k-means算法的python代码,在实际应用中,可以根据数据集的特点选择合适的簇数和参数,得到更好的聚类效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值