基于python的k_means算法实现

小菜鸡的博客

前言

本篇文章主要是基于python,编程实现K_means算法的可视化。
编码的数据来源是一些地理坐标,以 txt 格式存储。

一、K_means是什么?

K-Mean算法,即 K 均值算法,是一种常见的聚类算法。算法会将数据集分为 K 个簇,每个簇使用簇内所有样本均值来表示,将该均值称为”质心”。

1. 原理

容易受初始质心的影响;算法简单,容易实现;算法聚类时,容易产生空簇;算法可能收敛到局部最小值。

通过聚类可以实现:发现不同用户群体,从而可以实现精准营销;对文档进行划分;社交网络中,通过圈子,判断哪些人可能互相认识;处理异常数据。

距离计算方式是 欧式距离。

1.从样本中选择 K 个点作为初始质心(完全随机)
2.计算每个样本到各个质心的距离,将样本划分到距离最近的质心所对应的簇中
3.计算每个簇内所有样本的均值,并使用该均值更新簇的质心
4.重复步骤 2 与 3 ,直到达到以下条件之一:
质心的位置变化小于指定的阈值
达到最大迭代次数

二、编程实现

通过原理我们可以发现,实现K_means算法的三个关键点在于:
(1)初始的K值选取;
(2)质心变化的限定阈值;
(3)最大迭代次数,确保算法最终能够停止。
当然越好的距离计算公示得到的聚类簇就越完美,一般是使用欧式距离公式
此外由于python提供了数据挖掘类的一些库,编程就很简单了

1. 首先引入库

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

2.读入数据

with open("testSet.txt") as file:
    data = np.loadtxt(file)

这里采用np库将文本类型的数据结构转换成元组

3.算法实现

其实将坐标直接可视化就已经可以确定K的值了,但是一些极端的数据聚类时可能我们人眼分的并不好这里可以采用SSE用于评估算法的聚类效果,同时通过SSE选取落差最大的K值作为聚类的质心。代码奉上:


k = 4
model = KMeans(n_clusters=k, init="random",
               max_iter=200, tol=1e-04)

model = model.fit(data)

是不是觉得很简单,分别设置质心,质心的选取方式(这个其他的选取方式大家可以看这里:python K_means库介绍
然后设置迭代次数以及阈值

4.可视化实现

就是简单的利用matplotlib库而已


plt.figure(2)
colors = ['b', 'g', 'y', 'c', 'pink']
markers = ['v', 's', 'o', '1', '2', '3']
plt.title("K_means")
plt.xlabel('East Longitude', fontsize=10)
plt.ylabel('North Latitude', fontsize=10)
for id, label in enumerate(model.labels_):
    plt.scatter(data[id][0], data[id][1],
                color=colors[label], marker=markers[label],
                s=20)

plt.scatter(
    model.cluster_centers_[:, 0], model.cluster_centers_[:, 1],
    color='red', label="centroids", s=50, marker='v'
)
plt.grid(True)

三、完整代码及展示

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

with open("数据文件名称.txt") as file:
    data = np.loadtxt(file)

plt.figure(1)
plt.title("First")
plt.xlabel('East Longitude', fontsize=10)
plt.ylabel('North Latitude', fontsize=10)

plt.scatter(data[:, 0], data[:, 1], color="red",
            marker='o', s=20)
plt.grid(True)

k = 4
model = KMeans(n_clusters=k, init="random",
               max_iter=200, tol=1e-04)

model = model.fit(data)

plt.figure(2)
colors = ['b', 'g', 'y', 'c', 'pink']
markers = ['v', 's', 'o', '1', '2', '3']
plt.title("K_means")
plt.xlabel('East Longitude', fontsize=10)
plt.ylabel('North Latitude', fontsize=10)
for id, label in enumerate(model.labels_):
    plt.scatter(data[id][0], data[id][1],
                color=colors[label], marker=markers[label],
                s=20)

plt.scatter(
    model.cluster_centers_[:, 0], model.cluster_centers_[:, 1],
    color='red', label="centroids", s=50, marker='v'
)
plt.grid(True)

SSE = []
for k in range(1, 7):
    cn = KMeans(n_clusters=k)
    cn.fit(data)
    SSE.append(cn.inertia_)
plt.figure(3)
X = range(1, 7)
plt.xlabel("K")
plt.ylabel("SSE")
plt.plot(X, SSE, 'o-')
plt.show()

然后展示我运行的一个结果
直接以坐标画点,这里我们就已经可以看出K应该取4.

基于python的k_means算法实现

套用K-means聚类:

基于python的k_means算法实现

SSE展示界面:

基于python的k_means算法实现
最后啰嗦一句,代码中的参数大家可以根据自己的实际情况进行修改,同时这个代码也不够精炼,供大家参考就好。

总结

以上就是今天要讲的内容,本文仅仅就是一个简单的基于python实现的

K-means算法的可视化,没有什么难的地方,就是简单的套用一些python的库。如果大家觉得对自己有一些帮助,还请点个赞哦,本人也是初学者,互帮互助。谢谢!!!!😊😊😊

Original: https://blog.csdn.net/xioacaiji/article/details/122811115
Author: 小菜鸡@
Title: 基于python的k_means算法实现

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/549704/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球