Skip to main content

K均值算法

说明:

这是一种解决聚类问题的算法,这个方法简单地利用了一定数量的集群(假设 K 个集群)对给定数据进行分类。

通过观察集群形状和分布来判断集群数量 K 均值算法如何划分集群:

  1. 从每个集群中选取 K 个数据点作为质心(centroids)。
  2. 将每一个数据点与距离自己最近的质心划分在同一集群,即生成 K 个新集群。
  3. 找出新集群的质心,这样就有了新的质心。
  4. 重复 2 和 3,直到结果收敛,即不再有新的质心出现。

原理:

想要将整个数据进行分类,假设分成2类。随机取两个随机点,将这些数据与这两个点最近的距离进行分类。分好类后再重新将这两个点进行移动,移动到两个数据的中心点。再对整个数据的离点的距离进行分类。直到这两个点不动为止,则找到了最终的簇中心点。

示例代码:

from sklearn.cluster import KMeans
import numpy as np

# 创建一些示例数据
X = np.array([[1, 2], [2, 3], [2, 5], [3, 2], [3, 3], [4, 5]])

# 创建K均值模型
k = 2 # 指定要分为的簇的数量
model = KMeans(n_clusters=k)

# 拟合模型
# .fit()方法用于训练模型,即让模型从数据中学习
# 自动将数据合理分为k簇
model.fit(X)

# 获取簇中心点
cluster_centers = model.cluster_centers_

# 预测每个样本所属的簇
labels = model.labels_

print("簇中心点:", cluster_centers)
print("样本所属簇:", labels)

简单实例代码:

# 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import load_iris

# 加载数据
iris = load_iris()
iris_X = iris.data
iris_y = iris.target

# 创建K均值模型
kmeans = KMeans(n_clusters=3)
# 拟合模型,注意看这是无监督学习,这里只填写了数据集,没有给标签。
kmeans.fit(iris_X)

# 获取簇中心和簇标签
centers = kmeans.cluster_centers_
labels = kmeans.labels_
print(iris_y)
print(labels)

# 我们发现他把0、1、2分类成了1、0、2,这是因为K均值算法是无监督学习,他不知道我们的标签是什么,所以他自己给我们分了一套标签。

预测准确率:

"""
我们已知这个模型有对应的标签
我们将获取的簇标签与原标签进行比较获取正确率
"""
# 使用列表推导式将0、1、2转换成1、0、2
exchange={0:1,1:0,2:2}
exchange_labels = [exchange[i] if i in exchange else i for i in labels]

right = 0
error = 0
for i in zip(exchange_labels,iris_y):
if i[0] == i[1]:
right +=1
else:
error +=1

print('正确率:{}%'.format(right/(right+error)*100))

二维可视化:

# 数组切片二维x[行,列]
# 选取第1、2特征值与中心点
plt.scatter(iris_X[:, 0], iris_X[:, 1], c=labels)
plt.scatter(centers[:, 0], centers[:,1], c="red", marker="x")
plt.title("Kmeans")
plt.show()

# 选取第3、4项特征值与中心点
plt.scatter(iris_X[:, 2], iris_X[:,3], c=labels)
plt.scatter(centers[:, 2], centers[:,3], c="red", marker="x")
plt.show()