本周课程导学
1.无监督学习简介
利用无标签的数据学习数据的分布或数据与数据之间的关系被称作无监督学习。
• 有监督学习和无监督学习的最大区别在于数据是否有标签
• 无监督学习最常应用的场景是聚类(clustering)和降维(DimensionReduction)
聚类和分类都是无监督学习的典型任务,任务之间存在关联,比如某些高纬数据的分类可以通过降维处理更好的获得,另外学界研究也表明代表性的分类算法如k-means与降维算法如NMF之间存在等价性。
-> 聚类
聚类(clustering),就是根据数据的“相似性”将数据分为多类的过程。
评估两个不同样本之间的“相似性” ,通常使用的方法就是计算两个样本之间的“距离”。使用不同的方法计算样本间的距离会关系到聚类结果的好坏。
–> 一些常用的距离概念(4个)以及计算方法
–>关于sklearn
sklearn中的聚类算法包含在sklearn.cluster这个模块中,如:K-Means,近邻传播算法,DBSCAN等。
以同样的数据集应用于不同的算法,可能会得到不同的结果,算法所耗费的时间也不尽相同,这是由算法的特性决定的。
sklearn.cluster模块提供的各聚类算法函数可以使用不同的数据形式作为输入:
标准数据输入格式: [样本个数,特征个数] 定义的矩阵形式。
相似性矩阵输入格式:即由 [样本数目,样本数目] 定义的矩阵形式,矩阵中的每一个元素为两个样本的相似度,如DBSCAN, AffinityPropagation(近邻传播算法)接受这种输入。如果以余弦相似度为例,则对角线元素全为1. 矩阵中每个元素的取值范围为[0,1]。
->降维
降维,就是在保证数据所具有的代表性特性或者分布的情况下,将高维数据转化为低维数据的过程,如数据的可视化、精简数据
–>关于sklearn
降维是机器学习领域的一个重要研究内容,有很多被工业界和学术界接受的典型算法,截止到目前sklearn库提供7种降维算法。
降维过程也可以被理解为对数据集的组成成份进行分解(decomposition)的过程,因此sklearn为降维模块命名为decomposition, 在对降维算法调用需要使用sklearn.decomposition模块。
单元1:聚类
1.1.K-means方法及应用
算法原理:
k-means算法以k为参数,把n个对象分成k个簇,使簇内具有较高的相似度,而簇间的相似度较低。
其处理过程如下:
1.随机选择k个点作为初始的聚类中心;
2.对于剩下的点,根据其与聚类中心的距离,将其归入最近的簇
3.对每个簇,计算所有点的均值作为新的聚类中心
4.重复2、 3直到聚类中心不再发生改变
kmeans处理流程举例:
1.2.K-means的应用
数据介绍:
现有1999年全国31个省份城镇居民家庭平均每人全年消费性支出的八个主要变量数据,这八个变量分别是:食品、 衣着、 家庭设备用品及服务、 医疗保健、 交通和通讯、 娱乐教育文化服务、 居住以及杂项商品和服务。 利用已有数据,对31个省份进行聚类。
实验目的:
通过聚类,了解1999年各个省份的消费水平在国内的情况。
技术路线:
sklearn.cluster.Kmeans
调用KMeans方法所需参数:
• n_clusters:用于指定聚类中心的个数
• init:初始聚类中心的初始化方法
• max_iter:最大的迭代次数
• 一般调用时只用给出n_clusters即可, init 默认是k-means++,max_iter默认是300
数据实例:
数据文件(city.txt):
城市名称、食品、 衣着、 家庭设备用品及服务、 医疗保健、 交通和通讯、 娱乐教育文化服务、 居住以及杂项商品和服务
北京,2959.19,730.79,749.41,513.34,467.87,1141.82,478.42,457.64
天津,2459.77,495.47,697.33,302.87,284.19,735.97,570.84,305.08
河北,1495.63,515.90,362.37,285.32,272.95,540.58,364.91,188.63
山西,1406.33,477.77,290.15,208.57,201.50,414.72,281.84,212.10
内蒙古,1303.97,524.29,254.83,192.17,249.81,463.09,287.87,192.96
辽宁,1730.84,553.90,246.91,279.81,239.18,445.20,330.24,163.86
吉林,1561.86,492.42,200.49,218.36,220.69,459.62,360.48,147.76
黑龙江,1410.11,510.71,211.88,277.11,224.65,376.82,317.61,152.85
上海,3712.31,550.74,893.37,346.93,527.00,1034.98,720.33,462.03
江苏,2207.58,449.37,572.40,211.92,302.09,585.23,429.77,252.54
浙江,2629.16,557.32,689.73,435.69,514.66,795.87,575.76,323.36
安徽,1844.78,430.29,271.28,126.33,250.56,513.18,314.00,151.39
福建,2709.46,428.11,334.12,160.77,405.14,461.67,535.13,232.29
江西,1563.78,303.65,233.81,107.90,209.70,393.99,509.39,160.12
山东,1675.75,613.32,550.71,219.79,272.59,599.43,371.62,211.84
河南,1427.65,431.79,288.55,208.14,217.00,337.76,421.31,165.32
湖南,1942.23,512.27,401.39,206.06,321.29,697.22,492.60,226.45
湖北,1783.43,511.88,282.84,201.01,237.60,617.74,523.52,182.52
广东,3055.17,353.23,564.56,356.27,811.88,873.06,1082.82,420.81
广西,2033.87,300.82,338.65,157.78,329.06,621.74,587.02,218.27
海南,2057.86,186.44,202.72,171.79,329.65,477.17,312.93,279.19
重庆,2303.29,589.99,516.21,236.55,403.92,730.05,438.41,225.80
四川,1974.28,507.76,344.79,203.21,240.24,575.10,430.36,223.46
贵州,1673.82,437.75,461.61,153.32,254.66,445.59,346.11,191.48
云南,2194.25,537.01,369.07,249.54,290.84,561.91,407.70,330.95
西藏,2646.61,839.70,204.44,209.11,379.30,371.04,269.59,389.33
陕西,1472.95,390.89,447.95,259.51,230.61,490.90,469.10,191.34
甘肃,1525.57,472.98,328.90,219.86,206.65,449.69,249.66,228.19
青海,1654.69,437.77,258.78,303.00,244.93,479.53,288.56,236.51
宁夏,1375.46,480.89,273.84,317.32,251.08,424.75,228.73,195.93
新疆,1608.82,536.05,432.46,235.82,250.28,541.30,344.85,214.40
实验代码:
# -*- coding: utf-8 -*-
import numpy as np
from sklearn.cluster import KMeans
def loadData(filePath):
'''
将文本文件中的数据保存到retData、retCityName这两个变量中并返回
'''
fr = open(filePath,'r+',encoding='utf-8')#读写打开一个文本文件
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))])
return retData,retCityName
if __name__ == '__main__':
data,cityName = loadData('city.txt')
km = KMeans(n_clusters=4)#聚类中心为4
label = km.fit_predict(data)#计算簇中心以及为簇分配序号,label为每行数据对应分配到的序列
print('label\n',label)
expenses = np.sum(km.cluster_centers_,axis=1)#按行求和
print('km.cluster_centers_\n',km.cluster_centers_)
print('expenses\n',expenses,'\n\n')
CityCluster = [[],[],[],[]]
#将在同一个簇的城市保存在同一个list中
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])
输出:
label
[1 3 0