python机器学习

无监督学习的目标

   利用无标签的数据学习数据的分布或者数局与数据之间的关系被称之为无监督学习
    有监督学习和无监督学习的最大区别在于数据是否有标签
    无监督学习的最常用场景是聚类(clustering)和降维(Diemension Reduction)
    聚类(clustering):
        根据数据的相似性,将数据分为多类的过程
        评估两个不同样本之间的相似性,通常的方法就是计算两个样本之间的"距离".使用不同的
    方法计算样本间的距离会关系到聚类结果的好坏
        欧氏距离:
            最常用的一种距离度量方法,源于欧式空间两点的距离,计算方法如下
                     

                     
        曼哈顿距离:
        

 

        马氏距离:
            
        余弦相似度:
             
            sklearn库提供了常用的聚类算法,包含在sklearn.cluster模块中,如:K-Means算法,近邻传播        算法,DBSCAN算法,等
            同样的数据应用不同的算法,可能会得到不同的结果,算法耗费的时间也不尽相同,这是由算法        的特性决定的
        sklearn.cluster的算法:
            
算法名称 参数     可扩展性    相似性度量
K-mearns 聚类个数 大规模数据  点间距离
DBSCAN 领域大小 大规模数据 点间距离
Gaussain
Mixtures
聚类个数及其其他超参 复杂度高,不适于大规模数据 马氏距离
Birch 分支因子,阀值等其他超参 大规模数据 两点间的欧氏距离
    降维(Diemension Reduction)
        降维就是在保证数据所具有的代表性特性或者分布的情况下,将高纬度的数据转化为低纬数的    过程:
        数据可视化
        精简数据
        所在模块:
        sklearn.decomposition
        sklearn.decomposition的算法
算法名称 参数     可扩展性   适用任务
PAC 所降维度及其其他超参 大规模数据 信号处理
FastICA 所降维度及其其他超参 超大规模数据 图形图像特征特征提取
NMF 所降维度及其其他超参 大规模数据 图形图像特征特征提取
LDA 所降维度及其其他超参 大规模数据 文本数据集,主题挖掘

 聚类详细介绍  
       K-means方法:
        K-means算法以k为参数,把n个对象分成k个簇,使簇内具有较高的相似度,而簇间的
    相似度较低
        处理过程:
            1 随机选择k个点作为初始的聚类中心
            2 对于剩下的点,根据其余=于聚类中心的距离,将其归入最近的簇
            3 对于每个簇,计算所有点的均值作为新的聚类中心
            4 重复2,3直到聚类中心不再发生改变

        K-means的应用:
            数据:现有1999年31省市的消费水平数据,包括:食品,衣着,家庭设备用品及服务,医疗保健,交            通和通讯,娱乐教育文化服务,居住以及杂项商品和服务,利用该数据进行聚类
    代码:
import numpy as np
from sklearn.cluster import KMeans


def load_data(file_name):
    '''

    :param file_name: 加载数据文件名
    :return: 城市名,消费数据
    '''
    # 读取文本,加载数据,处理数据,返回数据
    # 读取数据
    fr = open(file_name,'r+')
    lines = fr.readlines()
    #数据处理
    city_name = []
    city_expensive = []
    for line in lines:
        #将每行的数据进行处理,转换成单独的列表
        city_data = line.strip().split(',')

        city_name.append(city_data[0])
        city_expensive.append(
            [float(city_data[i]) for i in range(1,len(city_data))]
        )
        # print(city_expensive)

    return city_name,city_expensive



if __name__ == '__main__':

    '''
    创建K-means 算法,指定聚类中心的个数,
    加载数据,进行训练,得到label,
    求和,得到同类的数据平均值
    '''
    city_name,ciry_expensive = load_data('city.txt')
    num = input('请输入聚类的个数')
    #调用kMeans书法 指定聚类中心的个数
    km =KMeans(n_clusters=int(num),max_iter=30000)
    labels = km.fit_predict(ciry_expensive)
    expenses = np.sum(km.cluster_centers_,axis=1)
    # print(expenses)

    '''
    数据的展示,城市名称聚类
    按照label的数据进行聚类
    '''
    citys = []
    for i in range(int(num)):
        citys.append([])
    # print(citys)
    #将得到的城市按照label依次进行分类

    for i in range(len(labels)):
        citys[labels[i]].append(city_name[i])

    for i in range(len(citys)):
        print(citys[i])
        print('人均消费为: %.2f'%expenses[i])
得到的结果:
"C:\Program Files\Anaconda3\python.exe" F:/Pycharm/MachineLearning/demo2.py
请输入聚类的个数5
['天津', '江苏', '福建', '重庆', '云南', '西藏']
人均消费为: 5303.95
['河北', '山西', '内蒙古', '辽宁', '吉林', '黑龙江', '江西', '河南', '贵州', '陕西', '甘肃', '青海', '宁夏', '新疆']
人均消费为: 3736.88
['上海']
人均消费为: 8247.69
['北京', '浙江', '广东']
人均消费为: 7179.28
['安徽', '山东', '湖南', '湖北', '广西', '海南', '四川']
人均消费为: 4380.15

"C:\Program Files\Anaconda3\python.exe" F:/Pycharm/MachineLearning/demo2.py
请输入聚类的个数4
['天津', '江苏', '浙江', '福建', '重庆', '云南', '西藏']
人均消费为: 5477.90
['安徽', '湖南', '湖北', '广西', '海南', '四川']
人均消费为: 4357.67
['北京', '上海', '广东']
人均消费为: 7754.66
['河北', '山西', '内蒙古', '辽宁', '吉林', '黑龙江', '江西', '山东', '河南', '贵州', '陕西', '甘肃', '青海', '宁夏', '新疆']
人均消费为: 3788.76

Process finished with exit code 0

DBSCAN密度聚类
    聚类的时候不需要预先指定簇的个数
    最终的簇的个数不定
DBSCAN算法将数据点分成三类:
    核心点:在半径EPs内含有超过MInpts的数目点
    边界点:在半径EPs内点的数量小于MinPts,但是落在核心点的领域内
    噪音点:既不是核心点也不是边界点的点

 
 

   





















         

发表评论