【基于python实现k-means聚类算法】

基于python实现k-means聚类算法

说明:本文仅仅用代码实现自己对Kmeans聚类算法理解。不涉及该算法的原理及优化方法,然后利用生成的测试数据对聚类算法进行验证。后续将研究kmeans的优化方法及低复杂度的实现方法:

import numpy as np
import matplotlib.pyplot as plt
# from sklearn.cluster import KMeans


# 计算距离
def eucdistance(v1, v2):
    # if v1.ndim == 1:
    #     v1 = v1.reshape(1, -1)
    v1 = v1.reshape(1, -1) if v1.ndim == 1 else v1
    v2 = (v2.reshape(1, -1) if v2.ndim == 1 else v2)
    dist = np.sqrt(np.sum(np.power(v1 - v2, 2), 1))
    return dist


def init_k_centers(x, k):
	# 随机从数据集中挑选k个数据初始化kmeans聚类中心
    assert x.ndim == 2, "x's dim not is 2"
    k_centers = x[0: k]
    return k_centers

# np.hstack((sample, sample))
def k_means_v1(x_data, k, ITERS, error_thred=1e-3, random_state=None, showfig=True, colors=["g", "b", "y", "k"]):
    np.random.seed(random_state)
    np.random.shuffle(x_data)
    init_centers = init_k_centers(x_data, k=k)

    for iter in range(ITERS):
        results = {}
        sample_label = []
        for i in range(x_data.shape[0]):
            init_dist = np.inf
            sample = x_data[i]

            # label = 0
            for j_c in range(k):
                dist = eucdistance(sample, init_centers[j_c])[0]
                if dist < init_dist:
                    init_dist = dist
                    label = j_c

            sample_label.append(label)
        init_centers_t_1 = init_centers.copy()

        # 更新聚类中心
        for j_c in range(k):
            x_data_k = x_data[np.array(sample_label) == j_c]
            results[j_c] = x_data_k
            init_centers[j_c] = x_data_k.mean(axis=0)

        dist_center = eucdistance(init_centers_t_1, init_centers).mean()   # 新的聚类中心和上一次聚类中心的距离

        if showfig:
            plt.ion()
            plt.show()
            plt.cla()

            for key in results.keys():
                plt.scatter(results[key][:, 0], results[key][:, 1], color=colors[key], marker=".", s=8)
                plt.scatter(init_centers[key][0], init_centers[key][1], color=colors[key], marker="*", s=15)
                plt.text(1.5, 0.5, "iter=%.2i, Loss=%.4f" % (iter, dist_center))
                plt.pause(0.1)

            plt.ioff()
            plt.show()

        if dist_center <= error_thred or iter == ITERS - 1:
            print("*." * 20 + " k-means done " + "*." * 20)
            return results

if __name__ == '__main__':
    # x = np.random.randn(100, 2)
    x_data = np.array([[3, 10], [2, 9], [1, 9], [3, 7], [4, 8], [3.5, 6], [9, 0.5],
                       [8, 3], [9, 2], [8, 1], [10, 0.5], [6.5, 2], [6.5, 4]])

    results = k_means_v1(x_data=x_data, k=2, ITERS=20, error_thred=1e-3, random_state=42, showfig=True, colors=["g", "b", "y", "k"])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: K-means聚类算法是一种常见的无监督学习算法,用于将数据集分成k个不同的簇。Python中可以使用scikit-learn库中的KMeans类来实现K-means聚类算法。具体步骤如下: 1. 导入KMeans类和数据集 ```python from sklearn.cluster import KMeans from sklearn.datasets import make_blobs ``` 2. 生成数据集 ```python X, y = make_blobs(n_samples=100, centers=3, random_state=42) ``` 3. 创建KMeans对象并进行拟合 ```python kmeans = KMeans(n_clusters=3, random_state=42) kmeans.fit(X) ``` 4. 获取聚类结果 ```python labels = kmeans.labels_ ``` 5. 可视化聚类结果 ```python import matplotlib.pyplot as plt plt.scatter(X[:, ], X[:, 1], c=labels) plt.show() ``` 以上就是Python实现K-means聚类算法的基本步骤。 ### 回答2: K-means聚类算法是一种常见的无监督学习算法,它将n个样本分成k个簇,每个簇对应着一些数据点,使得同一簇内的数据点之间的相似度尽可能高,而不同簇的数据点之间的相似度尽可能低。Python是一种广泛使用的编程语言,也是进行K-means聚类的好选择。 以下是Python实现K-means聚类算法的步骤: 1. 导入数据集:将要聚类的数据集导入,可以是csv文件或者Excel文件,也可以是Python中自带的sklearn.datasets等数据集模块中的数据集。 2. 选择K值:决定将数据分成几个簇。可以通过手肘法或者轮廓系数法找到最优的K值,手肘法就是将数据集按照K值分割成K个簇并计算每个簇的误差平方和,一般来说误差平方和随簇数量的增加而减小,随着簇数量增加,在某个点后,曲线的下降趋势会减缓。轮廓系数法可以直观地描述每个数据点与其所处簇的相似程度和不同簇的相似程度,即同一簇内的相似度高,与其他簇的相似度低。 3. 初始化聚类中心:从数据集中随机选择K个点作为聚类中心。 4. 簇分配:对于每个数据点,计算其与每个聚类中心的距离,将其分配到距离最近的簇中。 5. 聚类中心更新:重新计算每个簇的聚类中心,即将簇内所有数据点的坐标进行平均,得到新的聚类中心。 6. 重复步骤4-5,直到聚类中心不再改变或达到最大迭代次数。 7. 输出簇:输出每个簇包含的数据点。 Python实现K-means聚类算法的示例代码: ```python from sklearn.cluster import KMeans from sklearn.datasets import make_blobs # 生成数据集 X, y = make_blobs(n_samples=500, centers=3, random_state=42) # 初始化KMeans聚类模型 model = KMeans(n_clusters=3, random_state=42) # 训练模型 model.fit(X) # 输出每个簇的聚类中心坐标 print("Cluster centers:", model.cluster_centers_) # 输出每个数据点所属的簇 print("Cluster labels:", model.labels_) ``` 以上就是Python实现K-means聚类算法的基本步骤和示例代码。在实际应用中,我们可以根据数据集的特点和需求对算法进行改进和优化,使得聚类效果更加准确和高效。 ### 回答3: K-means聚类算法是机器学习中常用的无监督学习方法之一,可以将一组数据集划分为K个簇(cluster),簇与簇之间的差异最小。Python提供了很多库,如sklearn、scipy.cluster.vq、numpy等可以实现K-means聚类算法,这里以sklearn库为例进行讲解。 首先,需要导入sklearn库中的KMeans模块,代码如下: ``` from sklearn.cluster import KMeans ``` 接着,需要确定K值,即簇的数量。可以通过手肘法(Elbow Method)来选择最优K值。手肘法是通过绘制不同K值对应的聚类误差值(即SSE,Sum of Squared Errors)与K值的折线图,确定最优的K值。代码如下: ``` import matplotlib.pyplot as plt from scipy.spatial.distance import cdist import numpy as np # 生成数据集 X = np.random.uniform(low=-10, high=10, size=(100, 2)) # 计算不同K值对应的SSE K_range = range(1, 10) sse = [] for k in K_range: kmeans = KMeans(n_clusters=k, random_state=0).fit(X) sse.append(sum(np.min(cdist(X, kmeans.cluster_centers_, 'euclidean'), axis=1)) / X.shape[0]) # 绘制折线图 plt.plot(K_range, sse, 'bx-') plt.xlabel('Number of clusters') plt.ylabel('SSE') plt.title('Elbow Method For Optimal k') plt.show() ``` 在绘制的折线图中,选择拐点处的K值作为最优的簇数。 选择完簇数后,就可以利用KMeans模块进行聚类了。代码如下: ``` # 将数据集聚类为3个簇 kmeans = KMeans(n_clusters=3, random_state=0).fit(X) # 绘制聚类结果图 plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_) plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], marker='x', color='black', s=100, linewidths=3) plt.title('K-means Clustering') plt.show() ``` 其中,kmeans.labels_为数据点所被聚到的簇的标号,kmeans.cluster_centers_为聚类中心。 以上就是利用Python实现K-means聚类算法的基本步骤,通过手肘法选择最优簇数,然后利用KMeans模块进行聚类,最后绘制聚类结果图。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值