第一种: 引用scikit-learn包
from sklearn.cluster import KMeansk = 10 # Kmeans的k值
model = Kmeans(n_clusters=k)
X = [[1, 2], [1, 3], [2, 1], ....] # 改成你的数据
model.fit(X)
# 然后就训练好了, 可以查看model的属性
model.cluster_centers
model.labels_
第二种: 自己写代码实现
import numpy as npimport random
data = [[1, 1, 1], [1, 1, 3], [1, 2, 1], [5, 1, 1], [5, 1, 2], [5, 2, 1], [5, 5, 5], [5, 5, 4], [5, 4, 4]]
data = np.array(data)
k = 4 # kmeans的k
n_iteration = 500 # 最大迭代次数
# 求初始化的k个质心(这k个质心必须包含在k个点的凸空间内)
center = np.matrix(np.zeros((k, len(data[0]))))
center_after = np.matrix(np.zeros((k, len(data[0]))))
for i in range(len(data[0])):
center[:, i] = min(data[:, i]) + (max(data[:, i]) - min(data[:, i])) * np.random.rand(k, 1)
def calc_distance(x, y, distance='eucidean'):
x, y = np.array(x), np.array(y)
if distance == 'eucidean':
return np.sqrt(np.sum((y - x)**2))
n = 0
while 1:
n += 1
print('第%s次迭代' % n)
# 计算所有点到每个质心的距离, 将每个点分到距离最近的那个点那一类
# 9个点里哪个质心最近, 就分到第几个类
label = np.argmin(np.array([calc_distance(x, y) for x in data for y in center]).reshape(len(data), k), axis=1)
print(label)
# 重新计算质心
for i in range(k):
center_after[i] = np.mean(np.array([data[j] for j in range(len(data)) if label[j] == i]), axis=0)
if np.sum(np.abs(center_after - center)) < 0.01:
# print(np.sum(np.abs(center_after - center)))
print('相邻两次迭代改变甚小, 迭代结束')
break
if n > n_iteration:
print('迭代次数已达上限, 迭代结束')
break
center = center_after
K-means算法是硬聚类算法,是典型的基于原型的目标函数聚类方法的代表,它是数据点到原型的某种距离作为优化的目标函数,利用函数求极值的方法得到迭代运算的调整规则。K-means算法以欧式距离作为相似度测度,它是求对应某一初始聚类中心向量V最优分类,使得评价指标J最小。算法采用误差平方和准则函数作为聚类准则函数。
通常,人们根据样本间的某种距离或者相似性来定义聚类,即把相似的(或距离近的)样本聚为同一类,而把不相似的(或距离远的)样本归在其他类。
所谓聚类问题,就是给定一个元素集合D,其中每个元素具有n个可观察属性,使用某种算法将D划分成k个子集,要求每个子集内部的元素之间相异度尽可能低,而不同子集的元素相异度尽可能高。其中每个子集叫做一个簇。
k-means算法是一种很常见的聚类算法,它的基本思想是:通过迭代寻找k个聚类的一种划分方案,使得用这k个聚类的均值来代表相应各类样本时所得的总体误差最小。
看起来还不错
分析一个公司的客户分类,这样可以对不同的客户使用不同的商业策略,或是电子商务中分析商品相似度,归类商品,从而可以使用一些不同的销售策略,等等。
需要选择一个k值,也就是我们希望把数据分成多少类,这里k值的选择对结果的影响很大,Ng的课说的选择方法有两种一种是elbow method,简单的说就是根据聚类的结果和k的函数关系判断k为多少的时候效果最好。