KNN算法原理与实现

31 篇文章 0 订阅
10 篇文章 0 订阅

KNN算法全称是:K-NearestNeighbor

顾名思义,KNN算法就是用离这个样本最近的K的个样本对这个样本进行预测

算法流程:

1. 设定参数K

2.计算样本与所有样本之间的距离并将这距离进行排序

3.取前K个样本

4.

回归:用这K个样本拟合一条直线(说法不是很准确,理解就好),然后将这个样本放进直线去预测

分类:计算K个样本的类别数量,类别数目最多的即为预测的类别

# -*- coding: utf-8 -*-
"""
Created on Sat May 11 11:10:02 2019

@author: admin
"""
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split

iris = load_iris()
iris_x=iris.data
iris_y=iris.target
trainX,testX,trainY,testY = train_test_split(iris_x,iris_y,test_size=0.3,random_state = 0)
#----------------------
def evaluate(predict,testY):
    k = 0
    for i in range(len(predict)):
        if predict[i] == testY[i]:
            k+=1
    print(k/len(predict))
def KNN_Classification(trainX,trainY,testX,k):#KNN近邻分
    testX = testX.reshape(1,4)
    an = trainX-testX
    an = an**2
    distance = np.sum(an,axis=1)
    distance = distance.reshape(trainX.shape[0],1)
    con = np.c_[distance,trainY]
    sor_arg = np.argsort(con[:,0])
    sor = con[sor_arg]
    tag = sor[:k]
    dic = {}
    for i in range(k):
        if tag[i][-1] in dic:
            dic[tag[i][-1]] += 1
        else:
            dic[tag[i][-1]] = 1
    re = 0
    m = 0
    for i in dic:
        if dic[i] > m:
            m = dic[i]
            re = i
    return int(re)
#----------------------
n=4
model = KNeighborsClassifier(n_neighbors=n)
model.fit(trainX,trainY)
predict = model.predict(testX)


evaluate(predict,testY)
lis = []
for i in range(len(predict)):
    pre = KNN_Classification(trainX,trainY,testX[i],n)
    lis.append(pre)
predic = np.array(lis)
evaluate(predic,testY)
print(predict)
print(predic)
print(testY)


优点1.      KNN分类器虽然简单,但已证明它的泛化错误率小于等于2*贝叶斯最优分类器错误率2.      可用于非线性分类3.      KNN主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法更适合4.      类别决策时,KNN仅依赖小部分样本,在不平衡样本集上表现较优。举个极端一点例子:答案只有A与B,但是训练样本中A的个数占99%,而B只有1%,svm、Bayes和NN训练出来的结果,恐怕预测任何数据给出的答案都是A,但是KNN不会。 
缺点
1.    (维数灾难)KNN属于密采样,它有一个重要假设:任何一个样本点x附近的小领域总能找到一个训练样本,维数太多的话,需要的计算样本太多
2.      距离计算在高维空间里比较麻烦
3.      相比决策树模型,KNN模型可解释性不强
4.      基本不学习,导致预测时速度比逻辑回归等算法慢 
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: knn算法(k-近邻算法)是一种分类和回归的算法,被广泛应用于模式识别、数据挖掘、图形识别等领域。其原理是根据数据本身的特征,将测试集中的每一个样本按照特征相似度进行分类。其中,k的值表示选择多少个最相似的邻居作为判断依据,通常采用欧氏距离来计算相似度。 在knn算法实现过程中,需要先将数据集分为训练集和测试集。接着,通过计算测试集中每一个样本与训练集中每一个样本的欧氏距离(或曼哈顿距离等),选择距离最近的k个邻居。最后,采用“多数表决”的方式选择样本类别,并将该类别赋给测试集中的样本。 在Python中,可以使用scikit-learn库实现knn算法。以下是一个简单的代码示例: from sklearn.neighbors import KNeighborsClassifier # 创建训练集和测试集 train_x = [[0], [1], [2], [3]] train_y = [0, 0, 1, 1] test_x = [[1.5]] # 创建knn分类器(k=2) knn = KNeighborsClassifier(n_neighbors=2) # 拟合模型 knn.fit(train_x, train_y) # 进行预测 print(knn.predict(test_x)) 以上代码中,第一行引用了scikit-learn库下的KNeighborsClassifier类,用于创建一个knn分类器。接着,分别创建了训练集和测试集,并针对训练集中的两类样本对应标签进行了标记。接下来,创建k值为2的knn分类器,并使用fit()方法对训练集进行拟合。最后,通过predict()方法进行实际的预测,并输出测试样本的分类结果。 总体来说,knn算法是一种简单易用的分类和回归算法,具有可解释性强、不受算法实现形式的特点,同时能够适应各种数据类型和特征。在Python中,采用scikit-learn库实现knn算法也非常方便。 ### 回答2: KNN算法是一种基于实例的学习方法,通过计算样本之间的距离来确定新样本的类别。KNN算法是一种简单而有效的分类方法,尤其适用于小数据集。算法原理是基于这样一种思想:样本空间中的每个样本都可以用它最近的K个邻居来代表。其中K是一个正整数,是预定的参数。当K=1时,为最近邻分类算法,即只考虑最近的一个邻居。 具体实现步骤: 1.读入数据集,并将其分为训练集和测试集。 2.对数据集进行归一化处理。 3.对每个测试实例,计算其与训练集中所有实例之间的距离。 4.按照距离的大小降序排列。 5.选取前K个距离最小的实例,得到它们所属的类别中出现次数最多的那个类别作为该测试实例的预测类别。 6.计算预测结果与实际结果的差异。 在Python实现KNN算法需要用到一些基本的库:Numpy和Scikit-learn。具体步骤如下: 1.导入Numpy库。 2.导入数据集并将其分为训练集和测试集。 3.使用Scikit-learn库中的MinMaxScaler函数进行数据归一化处理。 4.使用Scikit-learn库中的KNeighborsClassifier函数进行训练,设定参数k和metric。 5.使用Scikit-learn库中的predict函数进行预测,得到预测结果。 6.计算预测结果与实际结果的差异,得到预测准确率。 KNN算法的优点是简单易懂,精度高;缺点是计算复杂度高,对数据的大小敏感。当数据维度较高时,其计算复杂度会变得极高,而且KNN算法对数据的距离非常敏感,如果数据特征选取不当,会导致预测精度大幅下降。因此,在使用KNN算法的时候需要注意数据特征的选取和K值的选择。 ### 回答3: K近邻(k-NN)算法是最简单的基于实例的学习算法之一,它的主要思想是使用距离度量来对特征空间中的样本进行分类。KNN算法中的K代表选择邻居的数量,邻居是指在训练集中与测试数据距离最近的样本点。KNN算法的基本步骤如下: 1. 计算测试数据与所有训练数据之间的距离。 2. 根据距离度量,对距离最近的K个样本进行投票。 3. 根据投票结果,决定测试数据属于哪一类别。 KNN算法的优点是简单易用,能够处理多分类和回归问题;缺点是计算量大,对训练数据敏感,需要进行归一化处理,并需要选择合适的距离度量和K值。 Python实现KNN算法需要使用Scikit-learn或Numpy等相关库。下面给出一个简单的Python代码实现,该代码实现了一个基于欧氏距离的KNN分类器: ``` import numpy as np from sklearn.neighbors import KNeighborsClassifier # 生成训练数据 X_train = np.array([[1, 2], [3, 4], [5, 6], [7, 8]]) y_train = np.array([0, 0, 1, 1]) # 创建KNN分类器,选择K=3 clf = KNeighborsClassifier(n_neighbors=3) # 训练分类器 clf.fit(X_train, y_train) # 测试数据,预测其所属类别 X_test = np.array([[2, 3], [4, 5], [6, 7]]) y_test = clf.predict(X_test) print(y_test) ``` 该代码中,通过Numpy库生成了一个4个样本点的训练数据集,其中前两个样本属于类别0,后两个样本属于类别1。同时,也生成了3个测试数据点。然后使用Scikit-learn库中的KNN分类器,在训练数据上训练模型,选择K=3。最后,对测试数据进行分类,并输出分类结果。 以上就是KNN算法的基本原理Python实现,希望对读者有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值