无监督学习

目标

利用无标签的数据学习数据的分布或数据与数据之间的关系被称作无监督学习。

有监督学习与无监督学习的最大去区别在于数据是否有标签。

无监督学习最常见的应用场景是聚类降维

  1. 聚类
    • 聚类,就是根据数据的“相似性”将数据分为多类的过程。
    • 相似性评估:计算两个样本间的距离
    • 几个距离公式:
  • 欧式距离:

 d=\sqrt{\sum{(X-Y)^2}}, X=(x_1,x_2,...,x_n),Y=(y_1,y_2,...,y_n)))

 

  • 曼哈顿距离,也称城市街区距离。

d=\sum{|X-Y|}, X=(x_1,x_2,...,x_n),Y=(y_1,y_2,...,y_n)))

  • 马氏距离,表示数据的协方差,是一种尺度无关的度量方式。马氏距离会先将样本的各点的各个属性标准化,在计算样本间的距离。二维的马氏距离公式

d_(_x_i,_y_j_)=\sqrt{(x_i-x_j)^Ts^-^1(x_i-x_j)},   s^-^1是协方差矩阵。

  • 余弦相似度,用空间中两个向量的夹角的余弦值作为衡量两个样本差异的大小,值越接近1,夹角越接近0,越相似。

\cos\theta=\frac{\sum_{k=1}^n{x_{1k}x_{2k}}}{\sqrt{\sum_{k=1}^n{x_{1k}^2}}\sqrt{\sum_{k=1}^n{x_{2k}^2}}}

 

  1. sklearn聚类算法包含在sklearn.cluster这个模块中,K-Means,近邻传播算法,DBSCAN等。不同算法和数据,算法的耗时和结果不同。
  2. 函数调用数据的输入格式:
    1. 标准数据输入格式:[样本个数,特征个数]定义的矩阵形式;
    2. 相似性矩阵输入格式:[样本数目]定义的矩阵形式,矩阵中每个元素为两个样本的相似度,如DBSCAN,AffinityPropagation(近邻传播算法),如果以余弦相似度为例,则对角线元素全为1。矩阵中每个元素的取值范围为[0,1]。
  3. klearn.cluster模块代表函数
sklearn.cluster模块代表函数
算法名称 参数 可扩展性 相似性度量
K-means 聚类个数 大规模数据 点距离
DBSCAN 邻域大小 大规模数据 点距离
Gaussion.Mixtures 聚类个数即其他超参 复杂度高,不适合大规模数据 马氏距离
Birch 分子因子,阈值等其他超参 大规模数据 两点间欧氏距离

 

  1.  降维
    1. 就是在保证数据所具有的代表性特征或者分布的情况下,将高维数据转化为低维度数据的过程。
    2. 可以实现数据的可视化。
    3. 精简数据。
    4. 高位数据的分类通过降维处理可以得到分类,如分类算法k-means与降维算法NMF之间存在等价性。
    5. 降维,其实可以理解为对数据的组成成分进行分解(decomposition) 。
      sklearn.decomposition
      算法名称 参数 可扩展性 使用任务
      PCA 所降维度及其他超参数 大规模数据 信号处理
      FastICA 所降维度及其他超参数 超大规模数据 图形图像特征提取
      NMF 所降维度及其他超参数 大规模数据 图形图像特征提取
      LDA 所降维度及其他超参数 大规模数据 文本数据,主题挖掘
  2. K-means聚类算法:
    1. 算法以k为参数,把对象分为k簇,簇内相似度高,簇间相似度低。
    2. 随机选择k个点作为初始聚类中心。
    3. 然后根据距离公式计算其他点。
  3. import numpy as np
    from sklearn.cluster import KMeans
    
    def loadData(filePath):
        fr=open(filePath,'r+')
        lines=fr.readlines()                        #读取整个文件
    
        retData=[]                                  #城市各项消费信息
        retCityName=[]                              #城市名称
        print(lines)
        for line in lines:
            items=line.strip().split(",")           #返回城市名称,各项消费信息
            print(items)
    
            for item in items:
                it=item.strip().split(",")
                retCityName.append(it[0])
                retData.append([float(it[i]) for i in range(1,len(it))])
            
        return retData,retCityName
    
    if __name__=="__main__":
    
        data,cityName=loadData("E:\\python\data.txt")
    
        '''
        所需参数:
            n_clusters:指定聚类中心的个数
            init:初始聚类中心的初始化方法
            max_iter: 最大迭代次数
        '''
        
        km=KMeans(n_clusters=4,max_iter=1000)
        label=km.fit_predict(data)                  #计算簇中心,以及为簇分配序号
    
        expenses=np.sum(km.cluster_centers_,axis=1) #每个簇求和
    
        print(expenses)
    
        CityCluster=([],[],[],[])                       #将城市按label分成设定的簇
        for i in range(len(cityName)):
            CityCluster[label[i]].append(cityName[i])   #将每个簇的城市输出
    
        for j in range(len(CityCluster)):
            print("第%d类:"%(j+1))
            print(CityCluster[j])
            print("平均花费Expenses:%.2f\n"%expenses[j])  #每个簇的平均花费输出
           
            
    '''
    expense:聚类中心点的数值加和,即平均消费水平
    
    拓展和改进
        计算两条数据相似性时,skleande k-Means默认用的欧式距离。虽然还有余弦距离,
        马氏距离等多种方法,但没有设定距离方法的参数。
    
        可以更改源代码:
    
        建议使用scipy.apatial.distance.cdist
            scipy.apatial.distance.cdist(A,B,metric="cosine")使用余弦距离
    
    '''
    

读出的数据:

拆分数据:

聚类结果:

无监督学习_第1张图片

 

 

  1. 实践思考:
    1. loadData("E:\\python\data.txt"),程序中需要读入数据,注意路径格式的写法。
    2. readlines()加载了所有数据,['北京,2959.19,730.79,749.41,513.34,467.87,1141.82,478.42,457.64','...'...],第一次采用items=line.strip().split(",") 拆分为出''北京,2959.19,730.79,749.41,513.34,467.87,1141.82,478.42,457.64'', 第二次it=item.strip().split(",")拆分出城市名称和相关数据。

 

 

 

 

 

      

 

你可能感兴趣的:(无监督学习)