首页 > 编程知识 正文

python数据挖掘算法,python聚类给出类型

时间:2023-05-06 03:39:45 阅读:152317 作者:107

一.分簇算法概述' http://www.Sina.com/' (supervised learning ),其训练样本监督学习且监督学习http://www.Sina.com 在" (unsupervisedlearning )中,训练样本的标记信息是未知的,通过是带有标记信息无标记训练样本的学习来揭示数据的内在性质和规律,为进一步的数据分析奠定基础对于无监督学习,应用最广泛的是'目的是'(clustering )。

'无监督学习'尝试将数据集中的示例划分为几个通常不相交的子集。 每个子集称为“群集”(cluster )。 通过这样的分割,每个集群可能对应几个潜在的概念或类别。

从下图可以理解。

上图是一组未填写的样品,根据他们的分布,可以很容易地在上图的样品中做出以下区分。

需要将其分割为两个集群时,即k=2时:

需要将其分割为4个集群时,即k=4时:

2.k均值聚类算法k均值算法别名为k均值算法,k均值算法中的k表示簇是k个簇,均值对每个簇的数据值进行聚类

其算法思想大致是从样本集中随机选取k个样本作为聚类中心,计算所有样本与这k个“聚类中心”的距离,将每个样本分成与其最接近的“聚类中心”所在的聚类,进行更新

根据以上说明,可以推测实现k均值算法的主要4点:

)1)选择簇数k

)2)每个采样点到“集群中心”的距离

)3)基于新划分的集群,更新“以集群为中心”

)重复上述2和3的过程,直到“集群中心”不再移动

优缺点:

优点:易实现缺点:详细求解k均值算法步骤Step1.K的值的选择一般根据实际需要确定或实现算法,k均值算法步骤Step1.K具有收敛于局部最小值的可能性,对于大数据收敛较慢

说明:

目标是.重心数由用户给出,表示为k,k-means最终得到的簇数也为k

聚类.之后更新的重心数与初始k值相同

聚类算法.k-means最后被聚类的簇的数量等于用户指定的重心的数量,一个重心对应于一个簇,每个样本只能被聚类为一个簇

A.初始群集为空

Step2.为了将距离度量对象点划分为离聚类中心最近的聚类,需要最近邻的度量策略,在欧式空间中有时采用欧式距离,在处理文件中采用余弦相似度函数,有时采用曼哈顿距离作为度量,根据情况进行实际操作

2.1 .欧式距离

2.2 .曼哈顿距离

2.3 .余弦相似度a和b表示向量(x1,y1 ),(x2,y2 )

分子是a和b的点乘,分母是两者各自的L2次方,即把所有维值的平方相加后成角。

说明:

经过http://www.Sina.com/.step2得到k个新集群,其中每个样本被分类成k个集群之一

获得33558www.Sina.com/.k个新群集后,当前重心将失效,并且每个新群集必须计算自己的新重心

Step3.对于新重心的计算分类后生成的k个聚类,分别以聚类内到其他点的距离平均值最小的点为重心进行计算。 (对于具有坐标的聚类,可以将每个聚类坐标的平均值作为重心进行计算) ) ) ) ) ) ) ) ) )。

说明:

B.例如,新群集有三个示例。 [ 1,4 ],[ 2,5 ],[ 3,6 ]。 获得此群集的新重心=[123]/3,[456]/3]

经过3358www.Sina.com/.step3,得到k个新的重心作为在step2中使用的重心

step4.k-means的重心是否不再更改,或者是否指定了loop的最大次数loopLimit

说明:

C可以在不再改变每个集群的重心时停止k-menas

33558www.Sina.com/.loop次数超过looLimit时,停止k均值

D.只要满足两者中的任意一个条件,就能够停止k均值

如果33558www.Sina.com/.step4没有结束k-means,请重新执行step2-step3-step4

strong>D.如果Step4结束了k-means,则就打印(或绘制)簇以及质心

四.python实现+代码详解

        以下是python得实例代码以及代码的详解,应该可以理解的。

import randomimport pandas as pdimport numpy as npimport matplotlib.pyplot as plt# 计算欧拉距离def calcDis(dataSet, centroids, k): clalist=[] for data in dataSet: diff = np.tile(data, (k, 1)) - centroids #相减 (np.tile(a,(2,1))就是把a先沿x轴复制1倍,即没有复制,仍然是 [0,1,2]。 再把结果沿y方向复制2倍得到array([[0,1,2],[0,1,2]])) squaredDiff = diff ** 2 #平方 squaredDist = np.sum(squaredDiff, axis=1) #和 (axis=1表示行) distance = squaredDist ** 0.5 #开根号 clalist.append(distance) clalist = np.array(clalist) #返回一个每个点到质点的距离len(dateSet)*k的数组 return clalist# 计算质心def classify(dataSet, centroids, k): # 计算样本到质心的距离 clalist = calcDis(dataSet, centroids, k) # 分组并计算新的质心 minDistIndices = np.argmin(clalist, axis=1) #axis=1 表示求出每行的最小值的下标 newCentroids = pd.DataFrame(dataSet).groupby(minDistIndices).mean() #DataFramte(dataSet)对DataSet分组,groupby(min)按照min进行统计分类,mean()对分类结果求均值 newCentroids = newCentroids.values # 计算变化量 changed = newCentroids - centroids return changed, newCentroids# 使用k-means分类def kmeans(dataSet, k): # 随机取质心 centroids = random.sample(dataSet, k) # 更新质心 直到变化量全为0 changed, newCentroids = classify(dataSet, centroids, k) while np.any(changed != 0): changed, newCentroids = classify(dataSet, newCentroids, k) centroids = sorted(newCentroids.tolist()) #tolist()将矩阵转换成列表 sorted()排序 # 根据质心计算每个集群 cluster = [] clalist = calcDis(dataSet, centroids, k) #调用欧拉距离 minDistIndices = np.argmin(clalist, axis=1) for i in range(k): cluster.append([]) for i, j in enumerate(minDistIndices): #enymerate()可同时遍历索引和遍历元素 cluster[j].append(dataSet[i]) return centroids, cluster # 创建数据集def createDataSet(): return [[1, 1], [1, 2], [2, 1], [6, 4], [6, 3], [5, 4]]if __name__=='__main__': dataset = createDataSet() centroids, cluster = kmeans(dataset, 2) print('质心为:%s' % centroids) print('集群为:%s' % cluster) for i in range(len(dataset)): plt.scatter(dataset[i][0],dataset[i][1], marker = 'o',color = 'green', s = 40 ,label = '原始点') # 记号形状 颜色 点的大小 设置标签 for j in range(len(centroids)): plt.scatter(centroids[j][0],centroids[j][1],marker='x',color='red',s=50,label='质心') plt.show() 五.K-means算法补充

1.对初始化敏感,初始质点k给定的不同,可能会产生不同的聚类结果。如下图所示,右边是k=2的结果,这个就正好,而左图是k=3的结果,可以看到右上角得这两个簇应该是可以合并成一个簇的。

改进:
对k的选择可以先用一些算法分析数据的分布,如重心和密度等,然后选择合适的k

2.使用存在局限性,如下面这种非球状的数据分布就搞不定了:

3.数据集比较大的时候,收敛会比较慢

4.最终会收敛。不管初始点如何选择,最终都会收敛。可是是全局收敛,也可能是局部收敛。

六.小结

        1. 聚类是一种无监督的学习方法。聚类区别于分类,即事先不知道要寻找的内容,没有预先设定好的目标变量。

        2. 聚类将数据点归到多个簇中,其中相似的数据点归为同一簇,而不相似的点归为不同的簇。相似度的计算方法有很多,具体的应用选择合适的相似度计算方法

        3. K-means聚类算法,是一种广泛使用的聚类算法,其中k是需要指定的参数,即需要创建的簇的数目,K-means算法中的k个簇的质心可以通过随机的方式获得,但是这些点需要位于数据范围内。在算法中,计算每个点到质心得距离,选择距离最小的质心对应的簇作为该数据点的划分,然后再基于该分配过程后更新簇的质心。重复上述过程,直至各个簇的质心不再变化为止。

        4. K-means算法虽然有效,但是容易受到初始簇质心的情况而影响,有可能陷入局部最优解。为了解决这个问题,可以使用另外一种称为二分K-means的聚类算法。二分K-means算法首先将所有数据点分为一个簇;然后使用K-means(k=2)对其进行划分;下一次迭代时,选择使得SSE下降程度最大的簇进行划分;重复该过程,直至簇的个数达到指定的数目为止。实验表明,二分K-means算法的聚类效果要好于普通的K-means聚类算法。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。