fireholder.github.io

伪文艺女青年,状高冷,话少爱热闹


Blog | Archive | About

Python 机器学习 Note 1

03 Jul 2017 | Python

无监督学习

利用无标签的数据学习数据的分布或数据与数据之间的关系被称作无监督学习。 无监督学习最常应用的场景是聚类(clustering)和降维(DimensionReduction)。

聚类

聚类(clustering),就是根据数据的“相似性”将数据分为多类的过程。

评估两个不同样本之间的“相似性” ,通常使用的方法就是计算两个样本之间的“距离”。使用不同的方法计算样本间的距离会关系到聚类结果的好坏。

距离

欧式距离

欧氏距离是最常用的一种距离度量方法,源于欧式空间中两点的距离。

曼哈顿距离

曼哈顿距离也称作“城市街区距离”,类似于在城市之中驾车行驶,从一个十字路口到另外一个十字楼口的距离。

马氏距离

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

夹角余弦

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

Sklearn (scikit-learn)

sklearn 库提供的聚类算法函数包含在 sklearn.cluster 这个模块中。如: K-Means, 近邻传播算法 , DBSCAN 等。

K-means方法

k-means算法以k为参数,把n个对象分成k个簇,使簇内具有较高的相似度,而簇间的相似度较低。

处理过程如下:

  1. 随机选择k个点作为初始的聚类中心;
  2. 对于剩下的点,根据其与聚类中心的距离,将其归入最近的簇
  3. 对每个簇,计算所有点的均值作为新的聚类中心
  4. 重复2、3直到聚类中心不再发生改变
使用方法 :
    import numpy as np
    from sklearn.cluster import KMeans
    data,cityName = loadData('city.txt')          //加载数据
    km = KMeans(n<sub>clusters</sub>=3)                     //创建K-means算法实例
    label = km.fit<sub>predict</sub>(data)                  //进行训练,获得标签
    expenses = np.sum(km.cluster<sub>centers</sub>\_,axis=1)

    
参数
补充

计算两条数据相似性时,Sklearn 的K-Means默认用的是欧式距离。

实例
        \\#-\*-coding:UTF-8-\*-
        import numpy as np
        from sklearn.cluster import KMeans

        def loadData(filePath):
            fr = open(filePath,'r+',encoding="gb2312")
            lines = fr.readlines()
            retData = []
            retCityName = []
            for line in lines:
                items = line.strip().split(",")
                retCityName.append(items)
                retData.append([float(items[i]) for i in range(1,len(items))])
            return retData,retCityName

        if <span class="underline"><span class="underline">name</span></span> == '<span class="underline"><span class="underline">main</span></span>':
            data,cityName = loadData('city.txt')
            km = KMeans(n<sub>clusters</sub>=4)
            label = km.fit<sub>predict</sub>(data)
            expenses = np.sum(km.cluster<sub>centers</sub>\_,axis=1)
            #print(expenses)
            CityCluster = [[],[],[],[]]
            for i in range(len(cityName)):
                CityCluster[label[i]].append(cityName[i])
            for i in range(len(CityCluster)):
                print("Expenses:%.2f" % expenses[i])
                print(CityCluster[i])

        

DBSCAN 密度聚类

DBSCAN算法是一种基于密度的聚类算法:

DBSCAN算法将数据点分为三类:

算法流程
  1. 将所有点标记为核心点、边界点或噪声点;
  2. 删除噪声点;
  3. 为距离在Eps之内的所有核心点之间赋予一条边;
  4. 每组连通的核心点形成一个簇;
  5. 将每个边界点指派到一个与之关联的核心点的簇中(哪一个核心点的半径范围之内)。
使用
    import numpy as np
    from sklearn.cluster import DBSCAN

    sklearn.cluster.DBSCAN(eps=0.5, min<sub>samples</sub>=5, metric='euclidean')
    
参数
实例
    import numpy as np
    import sklearn.cluster as skc
    from sklearn import metrics
    import matplotlib.pyplot as plt

    mac2id=dict()
    onlinetimes=[]
    f=open('TestData.txt',encoding='utf-8')
    for line in f:
        mac=line.split(',')
        onlinetime=int(line.split(','))
        starttime=int(line.split(',').split(' ').split(':'))
        if mac not in mac2id:
            mac2id[mac]=len(onlinetimes)
            onlinetimes.append((starttime,onlinetime))
        else:
            onlinetimes[mac2id[mac]]=[(starttime,onlinetime)]
    real<sub>X</sub>=np.array(onlinetimes).reshape((-1,2))

    X=real<sub>X[</sub>:,0:1]

    db=skc.DBSCAN(eps=0.01,min<sub>samples</sub>=20).fit(X)
    labels = db.labels\_

    print('Labels:')
    print(labels)
    raito=len(labels[labels[:] == -1]) / len(labels)
    print('Noise raito:',format(raito, '.2%'))

    n<sub>clusters</sub>\_ = len(set(labels)) - (1 if -1 in labels else 0)

    print('Estimated number of clusters: %d' % n<sub>clusters</sub>\_)
    print("Silhouette Coefficient: %0.3f"% metrics.silhouette<sub>score</sub>(X, labels))

    for i in range(n<sub>clusters</sub>\_):
        print('Cluster ',i,':')
        print(list(X[labels == i].flatten()))

    plt.hist(X,24)
    plt.show()

    

参考资料:中国大学mooc

comments powered by Disqus

Older · View Archive (56)

康威生命游戏Python实现

对康威的生命游戏很感兴趣,想试下用Python实现。很巧在实验楼上看到了这个项目。

Newer

Python爬虫笔记