聚类算法之划分方法(k-means)

时间:2024-02-24 07:16:10

 聚类划分方法

    给定n个数据点的数据集合,构建数据集合的出K个划分,每个划分代表一个类别,2<k<sqrt(n)。算法思想,划分法需要预先指定聚类数目和聚类中心,计算每个点与其他点的距离,对于每个数据点都有n-1个距离值,对这些距离值进行排序,找出最接近的数据点,算出这些距离的和值。并进行下次迭代,这时数据中兴点位置改变,继续按照上方的步骤,逐步降低目标函数的误差值,直到目标函数值收敛时,得到最终聚类的结果。逐步对聚类结果进行优化、不断将目标数据集向各个聚类中心进行重新分配以获最优解。代表算K-means,K-medoids.(公式乱码,用文字代替)

setp1:指定K个聚类中心

setp2:(每一个数据点与初始聚类中心的距离)

setp3:(对每一个数据点x,找到最近的C(聚类中心),x分配到新的类C中)

setp4:(更新聚类中心点)

setp5:(计算每一类的偏差)

setp6:判断偏差是否小于阈值(自己设定),不小于则返回setp2

    当聚类是密集的,而聚类之间区别明显时,KMeans算法的效果较好。另外,对处理大数据集,该算法是高效率的,因为它的复杂度是,其中,n是所有对象的数目,K是聚类的数目,t是迭代的次数。通常。但是,KMeans算法只有在聚类的平均值被定义的情况下才能使用。如果处理符号属性的数据并不适用。KMeans算法对初始聚类中心和样本的输入顺序敏感,对于不同的初始聚类中心和样本输入顺序,聚类结果会有很大差别。由于采用迭代更新的方法,所以当初始聚类中心落在局部值最小附近时,算法容易生成局部最优解。另外,算法的效果受孤立点的影响很大。

优点:1简单,易于理解和实现;2,时间复杂度低3.聚类中心用各类别中所有数据的平均值表示k-means方法的缺陷1,需要对均值给出定义,2,需要指定要聚类的数目;3,一些过大的异常值会带来很大影响;4,算法对初始选值敏感;5,适合球形聚类6.果好坏依赖于对初始聚类中心的选择、容易陷入局部最优解、对K值的选择没有准则可依循、只能处理数值属性的数据、聚类结构可能不平衡。

简单说下:k-means和K-medoids区别,k-means聚类中心在空间上(也就是可能是在数据上,也可能不再数据上),K-medoids呢,聚类中心要求在数据上

简单实现k-means

from sklearn.cluster import KMeans
from sklearn import datasets
from dask.array.learn import predict
import numpy as np
iris = datasets.load_iris()
X = iris.data
y = iris.target
clf=KMeans(n_clusters=3)
model=clf.fit(X)
predicted=model.predict(X)
#设置区间
print(predicted)
k2y = np.array([0,1,2]) #
print(k2y[predicted])
print((k2y[predicted] == y).astype(int).mean())

好的这样做出来精确度为89.3%,聚类算法受到初始点的影响很大,初始点选取的好坏直接影响我们聚类精度。这是初始k-means ,当然可以改进算法,加核。。。。(这里不阐述)