测试使用

Budcs / 2024-03-17 / 原文

KNN、K-Means和FCM

k近邻法

k近邻法(k-nearest neighbor, k-NN)是一种基本的分类和回归方法,其分类的主要思想是:给定一个训练数据集,其中实例的类别已经确定,分类时,对于新的实例,根据其k个最近邻的训练实例的类别,通过多数表决等方式进行预测。

k-NN三个基本要素

  • k值的选择
  • 距离度量
  • 分类决策规则

k近邻算法

输入:

  1. 训练数据集

\[T = {(x_1, y_1), (x_2, y_2), \cdots, (x_N, y_N)} \]

其中,\(x_i\in\mathcal{X}\subseteq\mathbb{R}^n\)为实例的特征向量,\(y_i\in\mathcal{Y}=\{c_1,c_2,\cdots,c_K\}\)为实例的类别;

  1. 新实例的特征向量\(x\)

输出: 实例\(x\)所属的类\(y\)

算法流程:

  1. 根据给定的距离度量(如欧氏距离),在训练集\(T\)中找出与\(x\)最近邻的k个点,涵盖这k个点的\(x\)的邻域记作\(N_k(x)\)

  2. \(N_k(x)\)中根据分类决策规则(如多数表决)决定\(x\)的类别\(y\)

\[y=\arg\max_{c_j}\sum_{x_i\in N_k(x)}I(y_i=c_j),\quad i=1,2,\cdots,N;j=1,2,\cdots,K \]

其中,\(I\)为指示函数,即当\(y_i=c_i\)\(I\)为1,否则\(I\)为0.

总结: k-NN是分类算法、有监督学习,需要知道训练实例的类别。

import numpy as np
print("打印测试%f"%(0.3))
打印测试0.300000

K-means聚类

k均值聚类是基于样本集合划分的聚类算法,其聚类的基本思想是:将样本划分为k个子集,构成k个类,将n给样本分到k 个类中,每个样本到其所属类的中心距离最近。每个样本仅属于一个类,故k均值聚类是硬聚类

K均值聚类算法

输入: n个样本的集合\(X\);

输出: 样本集合的聚类结果\(C^{*}\).

算法流程:

  1. 初始化。令\(t=0\),随机选择k个样本作为初始聚类中心\(m^{(0)}=(m_1^{(0)},\cdots,m_l^{(0)},\cdots,m_k^{(0)})\)

  2. 对样本进行聚类。对于固定的聚类中心\(m^{(t)}=(m_1^{(t)},\cdots,m_l^{(t)},\cdots,m_k^{(t)})\),其中\(m_l^{(t)}\)是类\(G_l\)的中心,计算每个样本到类中心的距离(如欧氏距离),将每个样本划分与其最近的类中心的类中,最终得到聚类结果\(C^{(t)}\)

  3. 更新聚类中心。对聚类结果\(C^{(t)}\),计算当前各个类中样本的均值,作为新的类中心\(m^{(t+1)}=(m_1^{(t+1)},\cdots,m_l^{(t+1)},\cdots,m_k^{(t+1)})\)

  4. 如果迭代收敛或符合停止条件(即聚类结果\(C^{(t)}\)\(C^{(t+1)}\)一样),则输出\(C^{*}=C^{(t)}\);否则,令\(t=t+1\),返回第2步。

总结: k均值聚类是聚类算法、无监督学习,不需要知道训练实例的类别。

import numpy as np

模糊C均值聚类

模糊C均值聚类(Fuzzy C-means, FCM)是一种软聚类方法。硬聚类算法在分类时有一个硬性标准,根据该标准进行划分,分类结果非此即彼。软聚类算法更看重隶属度,隶属度在\([0,1]\)之间,每个对象都有属于每个类的隶属度,并且所有隶属度之和为 1,即更接近于哪一方,隶属度越高,其相似度越高。

图片