机器学习基础篇:K-Means聚类分析
常用的聚类分析算法
算法名称 | 算法描述 |
---|---|
K-Means | K-均值聚类也称为快速聚类法,在最小化误差函数的基础上将数据划分为预定的类数K。该算法原理简单并便于处理大量数据 |
K-中心点 | - |
系统聚类 | - |
K-Means聚类算法
基于距离的非层次聚类算法,在最小化误差函数的基础上将数据划分为预定的类数K,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。
1、算法过程
- 从N个样本数据中心随机选取K个对象作为初始的聚类中心
- 粉笔额计算每个样本到各个聚类中心的距离
- 所有对象分配完成后,重新计算K个剧烈的中心
- 与前一次计算得到的K个聚类中心比较,如果聚类中心发生变化,转过程2,否则转过程5
- 当质心不发生变化时停止并输出聚类结果
2、数据类型与相似性的度量
- 连续属性
对于连续属性,要先对各属性值进行零-均值规范,再进行距离的计算。在K-Means聚类算法中,一般要度量样本之间的距离、样本与簇之间的距离以及簇之间的距离;
度量样本之间的相似性最常用的是欧几里得距离、曼哈顿距离和闵可夫斯基距离; - 文档数据
对于文档数据使用余弦相似性度量,先将文档数据整理成文档-词矩阵格式
lost | win | team | … | coach | |
---|---|---|---|---|---|
文档一 | 14 | 2 | 8 | 0 | 8 |
文档二 | 2 | 3 | 4 | 1 | 16 |
两个文档之间的相似度计算公式为:
d(i,j) = cos(i,j)=向量i*向量j/|向量i||向量j|
- 目标函数
使用误差平方和SSE作为度量聚类质量的目标函数,对于两种不同的聚类结果,选择误差评分和较小的分类结果。 - 聚类代码
导入库及初始化数据集
import numpy as np
import matplotlib.pyplot as plt
import random
from sklearn.datasets import make_blobs
np.random.seed(123)
%matplotlib inline
X, y = make_blobs(centers=4, n_samples=1000) #生成聚类算法的测试数据,1000个样本
print(f'Shape of dataset: {X.shape}')
fig = plt.figure(figsize=(8,6))
plt.scatter(X[:,0], X[:,1], c=y)
plt.title("Dataset with 4 clusters")
plt.xlabel("First feature")
plt.ylabel("Second feature")
plt.show()
K-Means类实现
class KMeans():
def __init__(self, n_clusters=4):
self.k = n_clusters
def fit(self, data):
"""
将k-means模型拟合到给定的数据集
"""
n_samples, _ = data.shape
# 初始化群集中心
self.centers = np.array(random.sample(list(data), self.k)) #随机打乱
self.initial_centers = np.copy(self.centers)
#我们将跟踪数据点的分配是否正确
#对群集的访问已更改。如果它停止改变,我们就是
#完成模型拟合
old_assigns = None
n_iters = 0
while True:
new_assigns = [self.classify(datapoint) for datapoint in data]
if new_assigns == old_assigns:
print(f"训练结束后 {n_iters} 迭代!")
return
old_assigns = new_assigns
n_iters += 1
# 重新计算中心
for id_ in range(self.k):
points_idx = np.where(np.array(new_assigns) == id_)
datapoints = data[points_idx]
self.centers[id_] = datapoints.mean(axis=0)
def l2_distance(self, datapoint):
dists = np.sqrt(np.sum((self.centers - datapoint)**2, axis=1))
return dists
def classify(self, datapoint):
"""
给定一个数据点,计算最靠近
数据点。返回该群集的群集ID。
"""
dists = self.l2_distance(datapoint)
return np.argmin(dists)
def plot_clusters(self, data):
plt.figure(figsize=(12,10))
plt.title("初始中心为黑色,最终中心为红色")
plt.scatter(data[:, 0], data[:, 1], marker='.', c=y)
plt.scatter(self.centers[:, 0], self.centers[:,1], c='r')
plt.scatter(self.initial_centers[:, 0], self.initial_centers[:,1], c='k')
plt.show()
初始化和拟合模型
kmeans = KMeans(n_clusters=4)
kmeans.fit(X)
绘制初始和最终聚类中心
kmeans.plot_clusters(X)