K-means算法就是基于距离来对数据进行划分,基于的思想是类内距离最小化,即SSE最小。
1. K-means
基本的K-means算法非常简单,算法流程如下:
1)从所给数据中抽取n个样本,设为初始中心,应该尽可能使得这个初始中心靠近真实质心。比如先画图观察,又或者我先随机抽10次,然后从里面找一组最好的。
2)计算所有样本到n个中心的位置,把样本划分到最近,最相似的簇中。
3)更新簇质心,即计算每个簇的均值向量。
4)迭代更新直到误差或者迭代次数满足一定要求。
这里使用sklearn跑一个demo
# -*- coding: utf-8 -*-
"""
file: standKmeans - 标准K-means算法
author: UniqueZ_
date: 2017-07-28
"""
from sklearn.cluster import KMeans
from utils import load_data, draw_result, timing
def clustering(train_x, **params):
clf = KMeans(**params)
clf.fit(train_x)
return clf
@timing
def main():
train_x = load_data()
params = {
"n_clusters": 4,
"max_iter": 100,
"n_init": 10,
"init": "k-means++",
"algorithm": "full",
"tol": 1e-4,
"n_jobs": -1,
"random_state": 1
}
clf = clustering(train_x, **params)
print("SSE = {0}".format(clf.inertia_))
draw_result(train_x, clf.labels_, clf.cluster_centers_, "kmeans").show()
if __name__ == "__main__":
main()