zoukankan      html  css  js  c++  java
  • 机器学习入坑指南(六):K 近邻算法

    一、算法简介

    K 近邻 (KNN,K Nearest Neighbours) 是一种分类算法。

    算法的思想为:要判断一个东西属于哪一类,看看跟它特征最近似的 K 个东西都属于什么,如果这 K 个东西属于 A 类的最多,那我们就认为未知的那个东西也是 A 类的。

    举个栗子,小明拿到一个水果,皮是黄色的,可以剥开,甜甜的软软的,这时候麻麻买回来了一串香蕉一袋橘子,小明发现香蕉跟你拿的这个东西好像哦,于是他认定自己拿的这个水果也是香蕉。这是不是有点像小朋友认识东西的过程呢?

    与之前学习的算法不同的是,KNN 属于“非参数方法”。也就是说,我们没有假设样本符合什么样的分布情况,没有把分类问题转换为求解参数的过程。

    如图,假设输入特征是二元的,我们把样本数据的特征 $(x_1,x_2)$ 作为二维平面的点坐标,并用不同形状表示样本的类。那么想要判断点属于哪一类,只要把它也放在平面中,观察离它最近的 K(图中 K = 5)个点,发现三角形最多,于是需要预测的点就可以被认为属于三角形所代表的类。

    我们通常使用“欧氏距离”来表示两数据点的相近程度。当输入特征为多元时,假设平面中有两点 $x = (x_1,x_2,...x_n)$ 和 $y = (y_1,y_2,...y_n)$,其距离为

    $$distance = sqrt{sum_i^n(x_i - y_i)^2}$$

    注意

    使用欧氏距离存在一个问题,如果不同特征的值不在一个数量级上,那么数量级大的特征将会对距离产生决定性影响,所以,我们需要先进行「数据预处理」,对特征进行缩放。

    二、Python 代码实现

    示例数据地址:GitHub - Avik-Jain/100-Days-Of-ML-Code/datasets

    1 数据预处理

    # 导入库
    import numpy as np
    import matplotlib.pyplot as plt
    import pandas as pd
    # 导入数据
    dataset = pd.read_csv('Social_Network_Ads.csv')
    X = dataset.iloc[:, [2, 3]].values
    y = dataset.iloc[:, 4].values
    # 分割
    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)
    # 特征缩放
    from sklearn.preprocessing import StandardScaler
    sc = StandardScaler()
    X_train = sc.fit_transform(X_train)
    X_test = sc.transform(X_test)
    

    2 使用训练集拟合算法

    from sklearn.neighbors import KNeighborsClassifier
    classifier = KNeighborsClassifier(n_neighbors = 5, metric = 'minkowski', p = 2)
    classifier.fit(X_train, y_train)
    

    3 预测与评价

    # 使用测试集预测
    y_pred = classifier.predict(X_test)
    # 生成混淆矩阵
    from sklearn.metrics import confusion_matrix
    cm = confusion_matrix(y_test, y_pred)
    

    欢迎关注 Evan 的博客

  • 相关阅读:
    sklearn之线性回归
    机器学习概述
    scipy之定积分计算和简单图像处理
    scipy之插值器
    numpy之排序
    spring mvc 实现文件上传
    Maven安装本地jar包到本地仓库
    spring mvc实现转发和重定向
    sprign mvc 解决中文乱码问题
    spring mvc 中使用session
  • 原文地址:https://www.cnblogs.com/Evan-Gao/p/9709831.html
Copyright © 2011-2022 走看看