Python数据挖掘—聚类—KMeans划分法

概念

  • 聚类分析:是按照个体的特征将它们分类,让同一个类别内的个体之间具有较高的相似度,不同类别之间具有较大差异性
  • 无分类目标变量(Y)——无监督学习

K-Means划分法、DBSCAN密度法、层次聚类法

 

1、导入数据

 

 1 import pandas
 2 from sklearn.cluster import KMeans
 3 from sklearn.decomposition import PCA
 4 
 5 import matplotlib.pyplot as plt
 6 
 7 f=open("D:\\学习资料\\Python数据挖掘实战课程课件\\7.1\\data.csv",encoding='UTF-8')
 8 data=pandas.read_csv(f)
 9 
10 fColumns=[
11     '工作日上班时电话时长', '工作日下半时电话时长', 
12     '周末电话时长', 
13     '国际电话时长', '总电话时长', '平均每次通话时长'
14 ]
View Code

2、确定特征变量,特征变量之间的相关系数,确定因变量,重新确定特征变量

 1 import matplotlib
 2 from pandas.tools.plotting import scatter_matrix
 3 
 4 font={
 5       "family":"SimHei"}
 6 
 7 matplotlib.rc("font",**font)
 8 matplotlib.rcParams["axes.unicode_minus"]=False
 9 
10 #%matplotlib qt
11 
12 scatter_matrix(
13         data[fColumns],
14         figsize=(10,10),diagonal="hist")
15 
16 
17 dCorr=data[fColumns].corr()
18 
19 
20 fColumns=[
21     '工作日上班时电话时长', '工作日下半时电话时长', 
22     '周末电话时长', 
23     '国际电话时长', '平均每次通话时长'
24 ]
View Code

3、降维、设定质心

 1 #降维
 2 pca_2=PCA(n_components=2)
 3 data_pca_2=pandas.DataFrame(
 4         pca_2.fit_transform(data[fColumns]))
 5 
 6 plt.scatter(
 7         data_pca_2[0],
 8         data_pca_2[1])
 9 
10 
11 kmModel=KMeans(n_clusters=3)
12 kmModel=kmModel.fit(data[fColumns])
View Code

4、对图像分类并画图

 1 #对图像进行分类
 2 pTarget=kmModel.predict(data[fColumns])
 3 
 4 pandas.crosstab(pTarget,pTarget)  #看每类别的个数
 5 
 6 
 7 plt.scatter(
 8         data_pca_2[0],
 9         data_pca_2[1],
10         c=pTarget
11         )
View Code

5、不同特征量之间的相关性

 1 dMean=pandas.DataFrame(columns=fColumns+["分类"])
 2 data_gb=data[fColumns].groupby(pTarget)
 3 
 4 i=0
 5 for g in data_gb.groups:
 6     print(g)
 7     rMean=data_gb.get_group(g).mean()    #rMean是一个series结构
 8     print(rMean)
 9     rMean["分类"]=g        #在最后追加一行
10     dMean=dMean.append(rMean,ignore_index=True)   #将series添加在dataframe中
11     subData=data_gb.get_group(g)  
12     for column in fColumns:
13         print(column)
14         i=i+1
15         p=plt.subplot(3,5,i)
16         p.set_title(column)
17         p.set_ylabel(str(g)+"分类")
18         plt.hist(subData[column],bins=20)
View Code

 

 

K—mans

k:聚类算法当中的个数

means:均值算法

K-Means:使用均值算法把数据分成K个类的算法

算法目标:

是把n个样本点划分到k个类中,使得每个点都属于离它最近的质心对应的类,以之作为聚类的标准

质心

是指一个类,内部所有样本点的均值

 

计算步骤

第一步:取得K个初始质心:从数据中随机抽取k个点作为初始聚类的中心,由这个中心代表各个类

 

第二步:把每个点划分进相应的类:根据欧式距离最小原则,把每个点划分配进距离最近的类中

第三步:重新计算质心:根据均值等方法,重新计算每个类的质心

 

第四步:迭代计算质心:重复第二步和第三部,迭代计算质心

第五步:聚类完成:聚类中心不再发生移动

 

 

 

fit_transform是fit和transform的组合。

 

 我们知道fit(x,y)在新手入门的例子中比较多,但是这里的fit_transform(x)的括号中只有一个参数,这是为什么呢?

fit(x,y)传两个参数的是有监督学习的算法,fit(x)传一个参数的是无监督学习的算法,比如降维、特征提取、标准化

 

然后解释为什么出来fit_transform()这个东西,下面是重点:

fit和transform没有任何关系,仅仅是数据处理的两个不同环节,之所以出来这么个函数名,仅仅是为了写代码方便,

所以会发现transform()和fit_transform()的运行结果是一样的。

 

注意:运行结果一模一样不代表这两个函数可以互相替换,绝对不可以!!!

transform函数是一定可以替换为fit_transform函数的

fit_transform函数不能替换为transform函数!!!理由解释如下:

 sklearn里的封装好的各种算法都要fit、然后调用各种API方法,transform只是其中一个API方法,所以当你调用除transform之外的方法,必须要先fit,为了通用的写代码,还是分开写比较好 

也就是说,这个fit相对于transform而言是没有任何意义的,但是相对于整个代码而言,fit是为后续的API函数服务的,所以fit_transform不能改写为transform。

--------------------- 本文来自 陈士林 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/appleyuchi/article/details/73503282?utm_source=copy 

 

posted @ 2018-10-09 08:22  我不要被你记住  阅读(7021)  评论(1编辑  收藏  举报