前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第3节:K邻近法原理即numpy实现版

第3节:K邻近法原理即numpy实现版

作者头像
三更两点
发布2021-12-04 13:52:03
9350
发布2021-12-04 13:52:03
举报

文章目录

KNN基础

  • KNN(k-nearest neighbor,k-NN)是一种基本分类和回归方法.
  • 原理:给定一个数据集,对新输入的实例,在训练集中找到与该实例最邻近的k个实例,这K个实例多数属于某一类就把输入的实例分为这个类.
  • K近邻法

训练数据集

T = {(x_1,y_1),(x_2,y_2)...(x_N,y_N)}

根据给定的距离度量,在训练集T中找出与x最邻近的k个点,涵盖这k个点的x 的邻域记作

N_k (x)

; 在

N_k(x)

中根据分类决策规则(如多数表决)决定x的类别y: k近邻法的特殊情况是k=1的情形,称为最近邻算法。对于输入的实例点(特征向 量)x,最近邻法将训练数据集中与x最邻近点的类作为x的类。

原理

  • 三个要素-距离度量,k值选择,分类决策规则
  • 两个点的距离是相似程度的反应.使用欧式距离或者Lp距离或Minnkowski距离.
  • k值选择关键,因为K值的减小意味着整体的模型变得复杂,容易发生过拟合.
  • 分类规则:多数表决规则.
  • kd树是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构。 kd树是二叉树,表示对k维空间的一个划分(partition)。构造kd树相当于不断地用垂直于 坐标轴的超平面将k维空间切分,构成一系列的k维超矩形区域。kd树的每个结点对应于一 个k维超矩形区域。

numpy复现

代码语言:javascript
复制
# -*- coding:utf-8 -*-
# /usr/bin/python
'''
-------------------------------------------------------------------------
   @File Name      :  knn.py
   @Description    :  
   @Run Script     :  python  knn.py 
   @Envs           :  pip install 
   @Change Activity:
        1.  2021/12/3  下午1:48  : build
-------------------------------------------------------------------------
   @CodeStyle      :  standard, simple, readable, maintainable, and portable!
   @Author         :  Yan Errol 13075851954
   @Email          :  260187357@qq.com
   @Copyright      :  "Copyright 2021, Yan Errol"
-------------------------------------------------------------------------
'''
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from collections import Counter
# 加载读取数据

data = pd.read_csv("dataset.csv")
print(data.label.value_counts())
print("data\n",data)

# 数据可视化 验证线性可分性
plt.scatter(data[:50]['sepal length'], data[:50]['sepal width'], label='0')
plt.scatter(data[50:100]['sepal length'], data[50:100]['sepal width'], label='1')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.legend()
plt.show()
plt.savefig("show.png")

# 数据集拆分
data = np.array(data.iloc[:100,[0,1,-1]])
X,Y = data[:,:-1],data[:, -1]
XTrain,xtest,YTrain,ytest = train_test_split(X,Y,test_size=0.2)
class KNN():
    def __init__(self,XTrain,YTrain,nNeighbors=5,p=2):
        self.XTrain = XTrain
        self.YTrain = YTrain
        self.nNeighbors = nNeighbors
        self.p = p

    def predict(self,X):
        '''预测'''
        # 全局遍历
        knnlist = []
        for i in range(len(self.XTrain)):
            dist = np.linalg.norm(X - self.XTrain[i], ord=self.p)
            knnlist.append([round(dist,2), self.YTrain[i]])
        knnlist = sorted(knnlist,key=lambda x:x[0])
        minKnnlist = knnlist[0:self.nNeighbors]

        # 统计
        knn = [k[-1] for k in minKnnlist]
        count_pairs = Counter(knn)
        max_count = sorted(count_pairs, key=lambda x: x)[-1]
        return max_count

    def score(self,X_test, y_test):
        right_count = 0
        n = 10
        for X, y in zip(X_test, y_test):
            label = self.predict(X)
            if label == y:
                right_count += 1
        return right_count / len(X_test)

clf = KNN(XTrain, YTrain)
resultScore = clf.score(xtest, ytest)
print(resultScore)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/12/03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • KNN基础
  • 原理
  • numpy复现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档