一.无监督学习的目标
利用无标签的数据学习数据的分布或数据与数据之间的关系被称作无监督学习。——无监督学习,没有给算法正确答案来回应数据集中的数据。
• 有监督学习和无监督学习的最大区别在于数据是否有标签
• 无监督学习最常应用的场景是聚类(clustering)和降维(Dimension Reduction)
二.聚类
聚类(clustering),就是根据数据的“相似性”将数据分为多类的过程。评估两个不同样本之间的“相似性” ,通常使用的方法就是计算两个样本之间的“距离”。使用不同的方法计算样本间的距离会关系到聚类结果的好坏。
(一)距离的分类
(1)欧式距离
(2)曼哈顿距离
(3)马氏距离
(4)夹角余弦
scikit-learn库(以后简称sklearn库)提供的常用聚类算法函数包含在sklearn.cluster这个模块中,如:K-Means,近邻传播算法,DBSCAN,等。
sklearn.cluster模块提供的各聚类算法函数可以使用不同的数据形式作为输入:
标准数据输入格式:[样本个数,特征个数]定义的矩阵形式。
相似性矩阵输入格式:即由[样本数目,样本数目]定义的矩阵形式,矩阵中的每一个元素为两个样本的相似度,如DBSCAN,AffinityPropagation(近邻传播算法)接受这种输入。如果以余弦相似度为例,则对角线元素全为1. 矩阵中每个元素的取值范围[0,1]。
(二)K-means聚类算法实例
k-means算法以k为参数,把n个对象分成k个簇,使簇内具有较高的相似度,而簇间的相似度较低。
其处理过程如下:
1.随机选择k个点作为初始的聚类中心;
2.对于剩下的点,根据其与聚类中心的距离,将其归入最近的簇
3.对每个簇,计算所有点的均值作为新的聚类中心
4.重复2、3直到聚类中心不再发生改变
数据介绍:
现有1999年全国31个省份城镇居民家庭平均每人全年消费性支出的八个主要变量数据,这八个变量分别是:食品、衣着、家庭设备用品及服务、医疗保健、交通和通讯、娱乐教育文化服务、居住以及杂项商品和服务。利用已有数据,对31个省份进行聚类。
实验目的:
通过聚类,了解1999年各个省份的消费水平在国内的情况。
技术路线:sklearn.cluster.Kmeans
代码如下:
import numpy as np from sklearn.cluster import KMeans def loadData(filePath): fr = open(filePath,'r+') lines = fr.readlines() retData = [] retCityName = [] for line in lines: items = line.strip().split(",") retCityName.append(items[0]) retData.append([float(items[i]) for i in range(1,len(items))]) #retCityName:用来存储城市名称 retData:用来存储城市的各项消费信息 #返回值:返回城市名称,以及该城市的各项消费信息 return retData,retCityName if __name__ == '__main__': data,cityName = loadData(r'C:\Users\86493\Desktop\北理工机器学习慕课数据\聚类\31省市居民家庭消费水平-city.txt') km = KMeans(n_clusters=4) #若等于3则是聚成3类 label = km.fit_predict(data) expenses = np.sum(km.cluster_centers_,axis=1) #print(expenses) #将城市按label分成设定的簇,将每个簇的城市输出,将每个簇的平均花费输出 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])
结果显示如下:(expenses是平均消费水平)
Expenses:5678.62 ['天津', '浙江', '福建', '重庆', '西藏'] Expenses:3788.76 ['河北', '山西', '内蒙古', '辽宁', '吉林', '黑龙江', '江西', '山东', '河南', '贵州', '陕西', '甘肃', '青海', '宁夏', '新疆'] Expenses:7754.66 ['北京', '上海', '广东'] Expenses:4512.27 ['江苏', '安徽', '湖南', '湖北', '广西', '海南', '四川', '云南']
加载数据,创建K-means算法实例,并进行训练,获得标签。
注意点:
(1)open参数
1. fr = open(filePath,'r+') 2. lines = fr.readlines()
(2)如果报错:
报错原因:在Python中 \ 是转义符,\u表示其后是UNICODE编码,因此\User在这里会报错,在字符串前面加个 r(rawstring 原生字符串),可以避免python与正则表达式语法的冲突。
则在路径前加r即可:
data,cityName = loadData(r'C:\Users\86493\Desktop\北理工机器学习慕课数据\聚类\31省市居民家庭消费水平-city.txt')
拓展&改进
计算两条数据相似性时,Sklearn 的K-Means默认用的是欧式距离。虽然还有余弦相
似度,马氏距离等多种方法,但没有设定计算距离方法的参数。
源码地址:https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/metrics/pairwise.py
使用形式:scipy.spatial.distance.cdist(A, B, metric=‘cosine’)
三.降维
降维,即在保证数据所具有的代表性特性或者分布的情况下,将高维数据转化为低维数据的过程:数据的可视化和精简数据。
(0)聚类和降维都是无监督学习的典型任务,任务之间存在关联,比如某些高维数据的聚类可以通过降维处理更好的获得,另外学界研究也表明代表性的聚类算法如k-means与降维算法如NMF之间存在等价性。
(1)降维是机器学习领域的一个重要研究内容,有很多被工业界和学术界接受的典型算法,截止到目前sklearn库提供7种降维算法。
(2)降维过程也可以被理解为对数据集的组成成份进行分解(decomposition)的过程,因此sklearn为降维模块命名为decomposition, 在对降维算法调用需要使用sklearn.decomposition模块。
四.后面任务
通过实例展示如何利用sklearn库提供的分类和降维算法解决具体问题(大家可以通过本次的讲授先行思考下面的问题哪些是聚类问题,哪些是降维任务?):
31省市居民家庭消费调查
学生月上网时间分布调查
人脸图像特征抽取
图像分割