总结一下 KNN、K-means 和 SVM【附代码实现】

news2024/11/27 8:38:20

小小总结一下 KNN、K-means 和 SVM 及其 Python 实现

好久没更新了,最近准备秋招,在机器学习中感觉经常被问的几个算法:K近邻算法(K-Nearest Neighbors, KNN)、K均值聚类算法(K-means)以及支持向量机(Support Vector Machine, SVM)。给自己做个总结笔记,并贴出来,如果有误欢迎指出。


1. K近邻算法 (KNN)

什么是 KNN?

K近邻算法是一种监督学习算法,常用于分类和回归问题。它的核心思想是:给定一个新样本,找出在特征空间中距离它最近的K个已知样本,然后基于这些邻居的信息进行分类或预测。
在这里插入图片描述

工作原理:
  1. 选择参数K(即最近邻居的数量)。
  2. 计算新样本与训练数据集中所有样本的距离(通常使用欧几里得距离)。
  3. 选择距离最近的K个样本。
  4. 根据这K个邻居的类别,进行投票以决定新样本的类别(在分类问题中)。
KNN的优缺点:
  • 优点:简单易理解,适合小数据集,直观。
  • 缺点:随着数据量的增加,计算量也增加;对特征的尺度和噪声敏感。
Python实现KNN
import numpy as np
from collections import Counter

# KNN算法实现
class KNN:
    def __init__(self, k=3):
        self.k = k

    def fit(self, X_train, y_train):
        self.X_train = X_train
        self.y_train = y_train

    def predict(self, X_test):
        predictions = [self._predict(x) for x in X_test]
        return np.array(predictions)

    def _predict(self, x):
        # 计算欧几里得距离
        distances = [np.sqrt(np.sum((x - x_train)**2)) for x_train in self.X_train]
        # 选择K个最近邻
        k_indices = np.argsort(distances)[:self.k]
        k_nearest_labels = [self.y_train[i] for i in k_indices]
        # 进行投票
        most_common = Counter(k_nearest_labels).most_common(1)
        return most_common[0][0]

# 示例数据
X_train = np.array([[1, 2], [2, 3], [3, 4], [6, 7], [7, 8]])
y_train = np.array([0, 0, 0, 1, 1])
X_test = np.array([[2, 3], [5, 6]])

# KNN实例化并预测
knn = KNN(k=3)
knn.fit(X_train, y_train)
predictions = knn.predict(X_test)
print(predictions)

2. K均值算法 (K-means)

什么是 K-means?

K-means是一种无监督学习算法,常用于聚类问题。它通过将数据集划分为K个簇,使得同一簇中的数据点彼此之间更加相似,而与其他簇的数据点差异更大。
在这里插入图片描述

工作原理:
  1. 选择K个初始质心(可以随机选取数据点作为质心)。
  2. 将每个数据点分配给最近的质心,形成K个簇。
  3. 计算每个簇的质心。
  4. 重复步骤2和3,直到质心不再改变(或变化微小)。
K-means的优缺点:
  • 优点:简单快速,适合大数据集。
  • 缺点:对初始质心选择敏感,可能陷入局部最优,K值需要人为设定。
Python实现K-means
from sklearn.cluster import KMeans
import numpy as np

# 示例数据
X = np.array([[1, 2], [1.5, 1.8], [5, 8], [8, 8], [1, 0.6], [9, 11]])

# K-means聚类
kmeans = KMeans(n_clusters=2)
kmeans.fit(X)

# 输出结果
print("簇的质心:", kmeans.cluster_centers_)
print("簇的分配:", kmeans.labels_)

##############################################################
# 以上是调包的代码,具体实现如下
##############################################################
import numpy as np

class KMeans:
    def __init__(self, k=2, max_iters=100):
        self.k = k  # 簇的数量
        self.max_iters = max_iters  # 最大迭代次数
        self.centroids = None  # 质心

    # 计算欧几里得距离
    def _euclidean_distance(self, a, b):
        return np.sqrt(np.sum((a - b) ** 2))

    # 随机初始化质心
    def _initialize_centroids(self, X):
        np.random.seed(42)
        indices = np.random.choice(X.shape[0], self.k, replace=False)
        return X[indices]

    # 更新每个簇的质心为该簇所有点的均值
    def _compute_centroids(self, clusters, X):
        centroids = np.zeros((self.k, X.shape[1]))
        for idx, cluster in enumerate(clusters):
            centroids[idx] = np.mean(X[cluster], axis=0)
        return centroids

    # 将每个数据点分配给最近的质心
    def _assign_clusters(self, X, centroids):
        clusters = [[] for _ in range(self.k)]
        for idx, point in enumerate(X):
            distances = [self._euclidean_distance(point, centroid) for centroid in centroids]
            nearest_centroid_idx = np.argmin(distances)
            clusters[nearest_centroid_idx].append(idx)
        return clusters

    # 拟合K-means模型
    def fit(self, X):
        self.centroids = self._initialize_centroids(X)

        for _ in range(self.max_iters):
            clusters = self._assign_clusters(X, self.centroids)
            previous_centroids = self.centroids
            self.centroids = self._compute_centroids(clusters, X)

            # 如果质心没有变化,提前终止
            if np.all(previous_centroids == self.centroids):
                break

    # 预测每个点所属的簇
    def predict(self, X):
        return [np.argmin([self._euclidean_distance(x, centroid) for centroid in self.centroids]) for x in X]


# 示例数据
X = np.array([[1, 2], [1.5, 1.8], [5, 8], [8, 8], [1, 0.6], [9, 11]])

# K-means实例化并训练
kmeans = KMeans(k=2)
kmeans.fit(X)

# 输出结果
print("质心:", kmeans.centroids)
predictions = kmeans.predict(X)
print("簇的分配:", predictions)


3. 支持向量机 (SVM)

什么是 SVM?

SVM是一种强大的监督学习算法,常用于分类问题。它的目标是找到一个最优的超平面,能够最大化区分不同类别的数据点。SVM不仅仅适用于线性可分问题,还可以通过引入核函数来处理非线性问题。
在这里插入图片描述

工作原理:
  1. 对于线性分类问题,SVM找到一个最大化分类间距的超平面。
  2. 对于非线性分类问题,SVM通过将数据映射到高维空间,使得数据在高维空间中线性可分。
  3. 核函数是SVM的核心之一,常见的核函数有线性核、RBF核等。
SVM的优缺点:
  • 优点:对高维数据效果好,能够处理非线性数据。
  • 缺点:对数据量较大的情况下计算开销较高,难以解释。
Python实现SVM
from sklearn import svm
import numpy as np

# 示例数据
X = np.array([[1, 2], [2, 3], [3, 4], [6, 7], [7, 8]])
y = np.array([0, 0, 0, 1, 1])

# SVM分类器
clf = svm.SVC(kernel='linear')
clf.fit(X, y)

# 测试数据预测
X_test = np.array([[2, 3], [5, 6]])
predictions = clf.predict(X_test)
print("SVM预测结果:", predictions)

##############################################################
# 以上是调包的代码,具体实现如下
##############################################################
import numpy as np

class SVM:
    def __init__(self, learning_rate=0.001, lambda_param=0.01, n_iters=1000):
        self.lr = learning_rate
        self.lambda_param = lambda_param  # 正则化参数
        self.n_iters = n_iters
        self.w = None  # 权重
        self.b = None  # 偏差

    # 拟合SVM模型
    def fit(self, X, y):
        n_samples, n_features = X.shape
        y_ = np.where(y <= 0, -1, 1)  # 将标签转化为-1和1

        # 初始化权重和偏差
        self.w = np.zeros(n_features)
        self.b = 0

        # 梯度下降
        for _ in range(self.n_iters):
            for idx, x_i in enumerate(X):
                condition = y_[idx] * (np.dot(x_i, self.w) - self.b) >= 1
                if condition:
                    # 如果分类正确,只需要最小化权重的正则项
                    self.w -= self.lr * (2 * self.lambda_param * self.w)
                else:
                    # 如果分类错误,更新权重和偏差
                    self.w -= self.lr * (2 * self.lambda_param * self.w - np.dot(x_i, y_[idx]))
                    self.b -= self.lr * y_[idx]

    # 预测数据类别
    def predict(self, X):
        linear_output = np.dot(X, self.w) - self.b
        return np.sign(linear_output)

# 示例数据
X = np.array([[1, 2], [2, 3], [3, 4], [6, 7], [7, 8]])
y = np.array([0, 0, 0, 1, 1])  # 标签:0变为-1,1保持不变

# SVM实例化并训练
svm = SVM()
svm.fit(X, y)

# 预测测试数据
X_test = np.array([[2, 3], [5, 6]])
predictions = svm.predict(X_test)
print("SVM预测结果:", predictions)


总结

  • KNN 是一种基于距离的简单分类方法,适合小规模数据集。
  • K-means 是一种聚类算法,能够将数据集分割成多个簇。
  • SVM 是一种强大的分类算法,适用于线性和非线性问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2187182.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【网络通信基础与实践番外三】TCP的三次握手和四次挥手和例题

一、TCP连接的三次握手 第一次握手&#xff1a;客户端首先向服务器发送一个特殊的TCP报文&#xff0c;这个报文段首部不包含应用层数据&#xff0c;但是在报文段中有一个SYN标志位被置1。因此这个特殊的报文段也被叫做SYN报文段&#xff0c;然后客户端随机选择一个初始序列号&a…

【JWT安全】portswigger JWT labs 全解

目录 1.利用有缺陷的 JWT 签名验证 ①接受任意签名 lab1:通过未验证的签名绕过 JWT 身份验证 ②接受无签名的token lab2:通过有缺陷的签名验证来绕过 JWT 身份验证 2.暴力破解密钥 ①使用hashcat lab3:通过弱签名密钥绕过 JWT 身份验证 3.JWT 标头参数注入 ①通过 jwk…

kubevirt基于CDI创建虚拟机

CDI介绍 KubeVirt 的 Containerized Data Importer (CDI) 是一个 Kubernetes 原生的数据管理组件&#xff0c;专门为虚拟机 (VM) 提供存储支持&#xff0c;尤其在虚拟机的镜像管理和数据导入方面非常有用。CDI 的主要用途是帮助用户轻松地将外部数据源导入到 Kubernetes 集群中…

Linux线程(三)终止线程与回收线程详解

1.终止线程 在示例代码&#xff0c;我们在新线程的启动函数&#xff08;线程 start 函数&#xff09;new_thread_start()通过 return 返回之后&#xff0c;意味着该线程已经终止了&#xff0c;除了在线程 start 函数中执行 return 语句终止线程外&#xff0c;终止线程的方式还…

Qt基础之四十八:按钮为何会有点击效果

我们从一个最简单的Window API窗口程序开始说起。 一.一个最简单的Window API窗口程序 #include <windows.h> #include <wingdi.h> // 声明窗口过程函数 LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);int WINAPI WinMain(HI…

Windows程序包管理器WinGet的使用方法

Windows 程序包管理器 WinGet 命令行工具作为应用安装程序的一部分在 Windows 11 和现代版本的 Windows 10 上提供。 WinGet 工具的当前预览版支持以下命令: 命令说明info显示有关系统的元数据&#xff08;版本号、体系结构、日志位置等&#xff09;。 有助于进行故障排除。i…

电磁兼容(EMC):整改案例(四)人体对EFT测试影响有多大?

目录 1. 异常现象 2. 原因分析 3. 整改方案 4. 总结 1. 异常现象 某产品按GB/T 17626.4标准进行电快速瞬变脉冲群测试&#xff0c;测试条件为&#xff1a;频率5kHz/100kHz&#xff0c;测试电压L&#xff0c;N线间2kV&#xff0c;L&#xff0c;N线对PE线4kV。测试过程中需要…

Linux学习笔记(五):shell脚本,强大的文本处理工具awk,sed

Linux学习笔记&#xff08;五&#xff09;&#xff1a;shell脚本&#xff0c;awk&#xff0c;sed&#xff0c;服务管理 1. Shell 脚本 Shell 脚本是一种使用 Shell 编写的脚本&#xff0c;它可以在 Linux 系统中执行各种任务。 1.1 变量 声明变量&#xff1a; 使用 export 命令…

C++容器类型内置函数随笔

vector 容器 添加数据 vector <int> v ; v.push_back(数据); 访问数据的两个迭代器b.begin()和v.end() vector <int> :: iterator it_begin v. begin(); //容器起始位置元素的指针vector <int> :: iterator it_end v.end(); //指向容器最后一个元素下一…

FinOps三人行:云计算时代的FinOps 反模式和SRE(文字+视频版)

简介 9月20日&#xff0c;由SRE专委会和雅菲奥朗主办的“FinOps三人行&#xff1a;云计算时代的FinOps 反模式和SRE”在线研讨会成功举办&#xff0c;三位业界专家雅菲奥朗刘峰老师、易点天下董金老师和辛诺科技Larry老师齐聚一堂&#xff0c;聚焦于云计算环境下的并购模式、运…

Python编码规范与常见问题纠正

Python编码规范与常见问题纠正 Python 是一种以简洁和易读性著称的编程语言&#xff0c;因此&#xff0c;遵循良好的编码规范不仅能使代码易于维护&#xff0c;还能提升代码的可读性和可扩展性。编写规范的 Python 代码也是开发者职业素养的一部分&#xff0c;本文将从 Python…

Java-数据结构-Map和Set(三)-习题 o(´^`)o

目录 ❄️一、习题一(只出现一次的数字)&#xff1a; ❄️二、习题二(随机链表的复制)&#xff1a; ❄️三、习题三(宝石与石头)&#xff1a; ❄️四、习题四(旧键盘)&#xff1a; ❄️五、习题五(前k个高频单词)&#xff1a; ❄️总结&#xff1a; ❄️一、习题一(只出现一…

【Nacos架构 原理】内核设计之Nacos一致性协议

文章目录 Nacos一致性协议为什么需要一致性协议Nacos选择了Raft&#xff08;强一致性&#xff09;&Distro&#xff08;最终一致性&#xff09;服务发现角度配置管理角度 Nacos自研Distro协议背景设计思想数据初始化数据校验写操作读操作 Nacos一致性协议 为什么需要一致性…

大模型笔记05--coze经典案例分析

大模型笔记05--coze经典案例分析 介绍经典案例分析抖音视频转小红书文案艺术照 & 卡通照片助手艺术照图像流卡通照片图像流多功能图像助手 注意事项说明 介绍 扣子是新一代 AI 应用开发平台&#xff0c;具备完善的生态系统&#xff0c;是国内最出色的AI平台之一。用好coze…

C/C++/EasyX ——入门图形编程(2)

【说明】这一篇的内容都是很基础的&#xff0c;所以内容会很多&#xff0c;具体现在也不知道要写多少&#xff0c;先写下去吧&#xff0c;新手小白们都不用担心&#xff0c;这个内容不会很难&#xff0c;因为我也是从一无所知过来的&#xff0c;很好入门的&#xff0c;&#xf…

游览器输入URL并Enter时都发生了什么 面试完美回答

文章目录 前言URL解析DNS解析**浏览器缓存****操作系统缓存**&#xff1a;**路由器缓存**&#xff1a;ISP&#xff08;Internet service provider&#xff09;缓存DNS递归解析IP地址的获取缓存结果 建立TCP连接发送HTTP请求服务器响应TCP链接断开渲染页面解析一 HTML解析过程解…

带你快速了解后端API服务的搭建

前言&#xff1a;写这篇文章的初衷是想分享一下我学习搭建后端API的过程&#xff0c;希望能帮助到和我一样想快速写API接口并部署到服务器上的同学&#x1f61c; 第一步&#xff1a;创建阿里云服务器 1、首先注册一个阿里云账号&#x1f917; 2、出于学习成本考虑&#xff0…

Linux系统,docker容器内查看pikachu源代码

在Linux系统中&#xff0c;要查看Docker容器内的Pikachu的源代码&#xff0c;需要先确保Pikachu的Docker镜像已经运行在系统上。以下是步骤和示例代码&#xff1a; 1、查找Pikachu容器的ID或名称&#xff1a; docker ps -a 2、使用docker exec命令进入运行中的Pikachu容器&am…

Spring MVC的运行流程详解

Spring MVC作为一个广泛使用的框架&#xff0c;提供了灵活且强大的MVC架构支持。尤其在业务系统中&#xff0c;Spring MVC能够有效地处理大量并发请求&#xff0c;提供良好的用户体验。本文将详细讲解Spring MVC的运行流程&#xff0c;以电商交易系统为案例&#xff0c;帮助读者…

不再烦恼!四款AI工具助你轻松打造完美PPT

嘿&#xff0c;各位办公室的小伙伴们&#xff0c;今儿咱们来聊聊那些让咱们工作生活大变样的“智能小伙伴”。作为每天跟PPT打交道的办公室文员&#xff0c;我敢说&#xff0c;自从有了这些神器&#xff0c;我的工作效率简直坐上了火箭&#xff0c;嗖嗖地往上涨&#xff01; 1…