Python机器学习(一):kNN算法

简介: 这段时间用opencv中的机器学习算法做了一下目标检测,效果还是不错的。但都是按照命令和库进行调用,基本对我来说是个黑盒子。固然工程师要会用工具,但如果不深入理解内部实现,是很难进步的。

这段时间用opencv中的机器学习算法做了一下目标检测,效果还是不错的。但都是按照命令和库进行调用,基本对我来说是个黑盒子。固然工程师要会用工具,但如果不深入理解内部实现,是很难进步的。所以我打算花上一些时间(可能两个月以上)来学习一下机器学习的基本概念,并且用python语言去实现一些经典的算法,希望自己能坚持下去吧~

img_ec51ed8390c536dcb3bc997bd58e443a.png
k-Nearest Neighbors
1.简介

kNN算法可以说是机器学习中最简单的一种算法了。它思想极其简单,应用数学知识很少,并且效果相对于它的复杂程度来说极其地好,许多问题都可以用它来解决。它的思想用上面的一张图就可以解释清楚。它的本质是让输入与给定的数据集进行距离的计算。如果最近的点大部分为某一类(比如说是A),则判定为A类。kNN中的k,就是跟输入比较的点的数量。这个是作为算法的一个参数。当然距离的计算方法有很多种,比如说欧拉距离

img_cbb5b334070d589446b7d9426b7b3eea.png
欧拉距离

多维的情况可以如下进行推导
img_dc96d77673d725c564c9c1629fc38739.png
三个维度

也可以使用明科夫斯基距离,其中p成为了算法的一个参数
img_36236a4739468461a66eaa5b89cd69b8.png
明科夫斯基距离

2.算法实现

算法大概可以用python进行封装成这个样子

"""
Created by 杨帮杰 on 9/25/18
Right to use this code in any way you want without warranty,
support or any guarantee of it working
E-mail: yangbangjie1998@qq.com
Assication: SCAU 华南农业大学
"""

import numpy as np
from math import  sqrt
from collections import  Counter


class KNNClassifier:

    def __init__(self,k):
        assert k>=1,"k must be valid"
        self.k = k
        self._X_train = None
        self._y_train = None

    def fit(self, X_train, y_train):
        """根据训练数据集X_train和y_train训练kNN分类器"""
        assert  X_train.shape[0] == y_train.shape[0], \
            "the size of X_train must be equal to the size of y_train"
        assert self.k <= X_train.shape[0], \
            "the size of X_train must be at least k"

        self._X_train = X_train
        self._y_train = y_train
        return self

    def predict(self, X_predict):
        """给定待预测数据集X_predict, 返回表示X_predict的结果向量"""
        assert self._X_train is not None and self._y_train is not None, \
            "must fit before predict!"
        assert X_predict.shape[1] == self._X_train.shape[1], \
            "the feature number of X_predict must be equal to X_train"

        y_predict = [self._predict(x) for x in X_predict]
        return np.array(y_predict)

    def _predict(self, x):
        """给定单个待预测数据x,返回x的预测结果值"""
        assert x.shape[0] == self._X_train.shape[1], \
            "the feature number of x must be equal to X_train"

        distances = [sqrt(np.sum((x_train - x) ** 2))
                     for x_train in self._X_train]
        nearest = np.argsort(distances)

        topK_y = [self._y_train[i] for i in nearest[:self.k]]
        votes = Counter(topK_y)

        return votes.most_common(1)[0][0]

    def __repr__(self):
        return "KNN(k=%d)" % self.k

AI 代码解读

可以看到,类中的fit方法也就是算法的训练过程什么都没干,就是把成员赋值。所以说,kNN是一个不需要训练模型的算法,或者说训练集本身就是模型。

python的机器学习库sciki-learn中,可以进行以下的方法进行调用

"""
Created by 杨帮杰 on 9/25/18
Right to use this code in any way you want without warranty,
support or any guarantee of it working
E-mail: yangbangjie1998@qq.com
Assication: SCAU 华南农业大学
"""

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

# 获得鸢尾花的数据集
iris = datasets.load_iris()

x = iris.data
y = iris.target

# 测试集与训练集分离,测试集为20%的总数据
X_train, X_test, y_train, y_test = \
    train_test_split(iris.data, iris.target, test_size=0.2)

# 对数据进行归一化处理
standarScaler = StandardScaler()
standarScaler.fit(X_train)

X_train_std = standarScaler.transform(X_train)
X_test_std = standarScaler.transform(X_test)

# 模型训练和测试
knn_clf = KNeighborsClassifier(n_neighbors=4)
knn_clf.fit(X_train_std,y_train)
score = knn_clf.score(X_test_std, y_test)

print(score)
AI 代码解读

结果如下。可以看到对于简单的多分类问题kNN算法有着很好的效果。


img_7ce379086a300c9acd67665404840236.png
训练准确率
3.需要注意的细节
  • 为了验证模型训练的结果,往往需要将数据分为训练集和测试集。模型训练之后将模型运用到测试集中,如果效果不好则说明参数和算法本身需要调整。

  • 机器学习中参数分为超参数模型参数。超参数是算法在实际运用中的参数,模型参数是算法在训练模型时需要的参数。kNN没有模型参数,而k值是典型的超参数。

  • 参数的度量单位不同,会对结果产生极大的影响。所以我们需要对数据映射到统一尺度,即归一化。其中归一化分为最值归一化和方差归一化。一般使用方差归一化

4.算法优缺点

优点:思想简单,实现起来比较容易,在多分类问题上效果很好
缺点:效率低下。如果有m个样本和n个特征,则算法复杂度为O(m*n)。当训练数据比较多的时候,可以想象速度有多感人。而且结果不具有可解释性。

References:
Python3 入门机器学习 经典算法与应用 —— liuyubobobo
机器学习实战 —— Peter Harrington

jacoby
+关注
目录
打赏
0
0
0
0
2
分享
相关文章
Python 高级编程与实战:深入理解数据科学与机器学习
本文深入探讨了Python在数据科学与机器学习中的应用,介绍了pandas、numpy、matplotlib等数据科学工具,以及scikit-learn、tensorflow、keras等机器学习库。通过实战项目,如数据可视化和鸢尾花数据集分类,帮助读者掌握这些技术。最后提供了进一步学习资源,助力提升Python编程技能。
Python 高级编程与实战:深入理解数据科学与机器学习
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化和调试技巧。本文将深入探讨 Python 在数据科学和机器学习中的应用,并通过实战项目帮助你掌握这些技术。
机器学习特征筛选:向后淘汰法原理与Python实现
向后淘汰法(Backward Elimination)是机器学习中一种重要的特征选择技术,通过系统性地移除对模型贡献较小的特征,以提高模型性能和可解释性。该方法从完整特征集出发,逐步剔除不重要的特征,最终保留最具影响力的变量子集。其优势包括提升模型简洁性和性能,减少过拟合,降低计算复杂度。然而,该方法在高维特征空间中计算成本较高,且可能陷入局部最优解。适用于线性回归、逻辑回归等统计学习模型。
34 7
基于机器学习的人脸识别算法matlab仿真,对比GRNN,PNN,DNN以及BP四种网络
本项目展示了人脸识别算法的运行效果(无水印),基于MATLAB2022A开发。核心程序包含详细中文注释及操作视频。理论部分介绍了广义回归神经网络(GRNN)、概率神经网络(PNN)、深度神经网络(DNN)和反向传播(BP)神经网络在人脸识别中的应用,涵盖各算法的结构特点与性能比较。
大模型开发:你如何确定使用哪种机器学习算法?
在大型机器学习模型开发中,选择算法是关键。首先,明确问题类型(如回归、分类、聚类等)。其次,考虑数据规模、特征数量和类型、分布和结构,以判断适合的算法。再者,评估性能要求(准确性、速度、可解释性)和资源限制(计算资源、内存)。同时,利用领域知识和正则化来选择模型。最后,通过实验验证和模型比较进行优化。此过程涉及迭代和业务需求的技术权衡。
176 2
构建高效机器学习模型:从数据处理到算法优化
【2月更文挑战第30天】 在数据驱动的时代,构建一个高效的机器学习模型是实现智能决策和预测的关键。本文将深入探讨如何通过有效的数据处理策略、合理的特征工程、选择适宜的学习算法以及进行细致的参数调优来提升模型性能。我们将剖析标准化与归一化的差异,探索主成分分析(PCA)的降维魔力,讨论支持向量机(SVM)和随机森林等算法的适用场景,并最终通过网格搜索(GridSearchCV)来实现参数的最优化。本文旨在为读者提供一条清晰的路径,以应对机器学习项目中的挑战,从而在实际应用中取得更精准的预测结果和更强的泛化能力。
【机器学习】包裹式特征选择之拉斯维加斯包装器(LVW)算法
【机器学习】包裹式特征选择之拉斯维加斯包装器(LVW)算法
323 0
【机器学习】包裹式特征选择之基于遗传算法的特征选择
【机器学习】包裹式特征选择之基于遗传算法的特征选择
386 0
利用机器学习算法改善电商推荐系统的效率
电商行业日益竞争激烈,提升用户体验成为关键。本文将探讨如何利用机器学习算法优化电商推荐系统,通过分析用户行为数据和商品信息,实现个性化推荐,从而提高推荐效率和准确性。
284 14

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等