zoukankan      html  css  js  c++  java
  • 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 

  • 相关阅读:
    safenet 超级狗 java调用 小计
    解析Javascript中大括号“{}”的多义性
    openlayers研究(一) 初始化流程
    计算球面两点间距离实现Vincenty+Haversine
    搭建高可用mongodb集群(四)—— 分片
    搭建高可用mongodb集群(三)—— 深入副本集内部机制
    搭建高可用mongodb集群(二)—— 副本集
    C# 7.1 的 Async Main()
    深入理解 C# 7.1 提供的 async 非同步 Main() 方法
    使用Blazor Server 线路处理程序 (circuit handler)跟踪打开的SignalR连接
  • 原文地址:https://www.cnblogs.com/U940634/p/9758300.html
Copyright © 2011-2022 走看看