sklearn无监督学习-聚类k-means
程序员文章站
2022-06-13 08:55:45
...
无监督学习
聚类
就是根据数据的”相似性”将数据分为多类的过程。评估两个不同样本之间的“相似性”,通常使用的方法就是计算两个样本之间的“距离”。使用不同的方法计算样本间的距离会关系到聚类结果的好坏。
1样本距离计算方法
欧式距离,曼哈顿距离,马氏距离,夹角余弦
2sklearn.cluster
sklearn.cluster模块提供的各聚类算法函数可以使用不同的数据形式进行输入:标准数据输入格式:[样本个数,特征个数]定义的矩阵
3K-means方法及应用
K-means算法以k为参数,把n个对象分成k个簇,使簇内具有较高的相似度,而簇间的相似度较低。其处理过程如下:
1.随机选择k个点作为初始的聚类中心;
2.对于剩下的点,根据其与聚类中心的距离,将其归入最近的簇
3.对于每个簇。计算所有点的均值作为新的聚类中心
4.重复2、3直到聚类中心不再发生改变
下面我们来看一个示例代码:(代码和数据在我的github给出,详见https://github.com/coder23263/k-means)
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))])
return retData,retCityName
if __name__ == '__main__':
data,cityName = loadData('city.txt')
km = KMeans(n_clusters=4)
label = km.fit_predict(data)
expenses = np.sum(km.cluster_centers_,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])
首先我给出一下调用kmeans方法所需参数
- n_cluster 用于指定聚类中心的个数
- init:初始聚类中心的初始化方法max_iter 最大迭代次数
- 一般调用时只给出n_clusters即可,init默认是k-means++,max_iter默认是300
- data 加载的数据
- lable:聚类后各数据所属的标签
- axis 按行求和
- fit_predict计算簇中心以及为簇分配序号
这段代码是对全国各个省份人均消费水平的聚类
首先,我们导入numpy和sklearn库
loadData函数是用来获取文件数据的,我就不多说了
下面的主函数就是k-means方法了
首先我们指定n_cluster即聚类中心数为4个
fit_predict计算簇中心以及为簇分配序号
expenses为对八项指标数据求和所得的人均消费水平
CityCluster = [[],[],[],[]]预备储备分类后的各个城市簇
依次打印分类后的城市数据
最后,感谢北理工老师提供的资源,这个示例是我在mooc上面看到的,北京理工大学的机器学习课程,主讲老师是礼欣和嵩天老师。我也是初学者,欢迎留言提问,一起进步。