聚类是数据挖掘中一种非常重要的学习流派,指将未标注的样本数据中相似的分为同一类,正所谓“物以类聚,人以群分”嘛。
k-means是聚类算法中最为简单、高效的,核心思想:由用户指定k个初始质心(initial centroids),以作为聚类的类别(cluster),重复迭代直至算法收敛。
换种说法就是,把n个对象分为k类,类里面的具有相似的特性,类与类之间就不具有那么高的相似性。
其中的原理过程是:
1.随机选择k个点作为初始的聚类中心
2.对于剩下的点,根据其与聚类中心的距离,将其归入最近的族
3.对于每个族,将会计算所有点的均值作为新的聚类中心
4.反复进行上述的步骤,直到收敛
简单看下,3族的例子:
缺点:
容易受到初始质心的影响,而易造成局部最优解时候,达到收敛。同时,k值的选取也会直接影响聚类结果,最优聚类的k值应与样本数据本身的结构信息相吻合,而这种结构信息是很难去掌握,因此选取最优k值是非常困难的。
项目步骤:
1.建立项目(例如各大类商品总额分),导入项目所需要的模块
import nump as np
from sklearn.cluster import KMeans
2.加载数据,对其进行训练聚类算法,从而获得标签
if __name__ = '__main__':
data,name = addData('project.txt')
km = KMeans(n_clusters=3)
label = km.fit_predict(data)
costs = np.sum(km.cluster_centers_,axis=1)
调用KMeans所需参数:
n_clusters 用于指定聚类中心个数;init 聚类中心初始化(默认k-means++);max_iter 最大迭代次数(默认300);axis 按行求和; fit_predict() 计算族中心以及分配族序号
def addData(filePath):
f = open(filePath,'r+')
lines = f.readlines()
retData = []
retName = []
for line in lines:
items = line.strip().split(",")
retName.append(items[0])
reData.append([float(items[i]) for i in range(1,len(items))])
return retName, retData
领取专属 10元无门槛券
私享最新 技术干货