kmeans算法用Python怎么实现

Python016

kmeans算法用Python怎么实现,第1张

第一种: 引用scikit-learn包

from sklearn.cluster import KMeans

k = 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 np

import 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为多少的时候效果最好。