赞
踩
什么是聚类任务
为什么叫KMeans聚类
KMeans流程
如何计算样本到中心点的距离
1. 欧氏距离测度 Euclidean Distance Measure
欧氏距离越大,相似度越低
2. 余弦距离测度 Cosine Similarity Measure
夹角越大,余弦值越小,相似度越低
因为是cosine,所以取值范围是-1到1之间,它判断的是向量之间的 方向而不是大小;两个向量有同样的方向那么cosine相似度为1,两 个向量方向相对成90°那么cosine相似度为0,两个向量正相反那么 cosine相似度为-1,和它们的大小无关。
选择Cosine相似度还是欧氏距离
总体来说,欧氏距离体现数值上的绝对差异,而余弦距离体现方向 上的相对差异。
例如,统计两部剧的用户观看行为,用户A的观看向量为(0, 1),用户B为(1,0);此时二者的余弦距离很大,而欧氏距离很 小;我们分析两个用户对于不同视频的偏好,更关注相对差异,显 然应当使用余弦距离。 而当我们分析用户活跃度,以登陆次数(单位:次)和平均观看时长 (单位:分钟)作为特征时,余弦距离会认为(1,10)、(10, 100)两个用户距离很近;但显然这两个用户活跃度是有着极大差 异的,此时我们更关注数值绝对差异,应当使用欧氏距离。
KMeans算法目标函数
上面的公式既是要去最小化的目标函数,同时也可以作为评价 KMeans聚类效果好坏的评估指标。
KMeans算法不保证找到最好的解
事实上,我们随机初始化选择了不同的初始中心点,我们或许会获 得不同的结果,就是所谓的收敛到不同的局部最优;这其实也就从 事实上说明了目标函数是非凸函数。
一个通常的做法就是运行KMeans很多次,每次随机初始化不同的 初始中心点,然后从多次运行结果中选择最好的局部最优解。
KMeans算法K的选择
没有所谓最好的选择聚类数的方法,通常是需要根据不同的问题, 人工进行选择的。
肘部法则(Elbow method)
改变聚类数K,然后进行聚类,计算损失函数,拐点处即为推荐的聚 类数 (即通过此点后,聚类数的增大也不会对损失函数的下降带来很 大的影响,所以会选择拐点)。
目标法则
如果聚类本身是为了有监督任务服务的(例如聚类产生features 【譬如KMeans用于某个或某些个数据特征的离散化】然后将 KMeans离散化后的特征用于下游任务),则可以直接根据下游任 务的metrics进行评估更好。
导包
- from sklearn.cluster import KMeans
- import numpy as np
- import matplotlib.pyplot as plt
- import pandas as pd
- from sklearn.preprocessing import MinMaxScaler
导入数据
- data = pd.read_csv('nba.csv')
- data.head()
处理数据
- minmax_scaler = MinMaxScaler()
- # 标准化数据
- X = minmax_scaler.fit_transform(data.iloc[:,1:])
使用肘部法则确定聚类的K值
- # 肘部法则
- loss = []
- for i in range(2,10):
- model = KMeans(n_clusters=i).fit(X)
- loss.append(model.inertia_)
-
- plt.plot(range(2,10),loss)
- plt.xlabel('k')
- plt.ylabel('loss')
- plt.show()
使用肘部法则,我们一般选取的是曲线平缓的时候,这里我们选取4作为K值
- k = 4
- model = KMeans(n_clusters=k).fit(X)
- # 将标签整合到原始数据上
- data['clusters'] = model.labels_
- data.head()
查看聚类统计结果
- for i in range(k):
- print('clusters:',i)
- label_data = data[data['clusters'] == i].iloc[:,0]
- print(label_data.values)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。