机器学习算法1---KNN

目录

一、KNN算法原理

1、KNN三要素

2、一个简单案例

3、算法原理简单实现

【KNN分类---等权】

【KNN分类-加权】

 【KNN回归---等权】

【KNN回归---加权】

4、注意要点

二、KNN算法实现

1、参数说明

2、鸢尾花数据案例

3、算法特点


一、KNN算法原理

k近邻(k-nearst-neiber),它计算的是待预测样本属性和标签样本属性的距离, 每个样本都可以用它最接近的k个邻居来代表。

它是监督学习,做分类&回归任务都可以。KNN在分类预测时,一般采用多数表决法;而在做回归预测时,一般采用平均值法。

1、KNN三要素

1)、【计算距离】计算待预测样本与训练集样本的距离

2)、【确定K值】从训练集中获取K个离待预测样本距离最近的样本数据

3)、【决策规则】K个中哪类样本多,这个待预测样本就判断为哪类

多数表决原则在计算机中有着广泛应用,特别是在自组织结构,也就是缺乏中心结构的体系中。区块链技术中发挥了核心作用的共识计算实质上也是遵照了多数表决原则。

2、一个简单案例

1)、【计算距离】将训练集中所有样例画入坐标系,计算待预测电影与已知分类的电影的欧式距离。

2)、【确定K值】按照距离升序排序,取前K个电影,假设k=3

3)、【决策规则】K个中哪类样本多,这个待预测电影就判断为哪类

3、算法原理简单实现

【距离】一般是欧式距离

\sqrt{\left( x_{1}-x_{2} \right)^{2}+\left( y_{1}-y_{2} \right)^{2}}

python计算欧式距离的3种方法:

a1 =np.array([3,104])
a2 =np.array([18,90])
dis1 = np.sum((np.array(a1) - np.array(a2)) ** 2) ** 0.5
dis2 = np.sqrt(np.sum(np.square(a1-a2)))
dis3 =np.linalg.norm(a1-a2)
# print(dis1) #20.518284528683193
# print(dis2) #20.518284528683193
# print(dis3) #20.518284528683193

【K值】K值太小,容易过拟合;K值太大容易欠拟合;因此需要网格搜索调参

【决策规则】分类模型(多数表决或加权多数表决),回归模型(平均值法或者加权平均值法)

加权---越近的投票权越大,通常用距离反比。

(1)多数表决和加权多数表决案例:

案例:距离待预测样本最近的5个点里,A类3个(距离分别是2,2,2),B类2个(距离分别是1,1)

  • 多数表决:A类3票,B类2票,判为A类;
  • 加权多数表决:

1)距离权重,A类(1/2票+1/2票+1/2票),B类(1票+1票)

2)距离权重和,sum=1/2+1/2+1/2+1+1=7/2

3)距离权重归一化,A1=(1/2)/ sum=1/7票 ;B1=(1)/sum =2/7票

4)分类求和:A类3/7票,B类4/7票,判为B类。

【KNN分类---等权】

##一、等权分类
import numpy as np
import pandas as pd
##初始化训练数据
T = [[3, 104, -1],
     [2, 100, -1],
     [1, 81, -1],
     [101, 10, 1],
     [99, 5, 1],
     [98, 2, 1]
     ]
##预测数据
x_test = [18, 90]
##邻居
K = 5

##思路:
#1、计算x到所有样本点的距离---sqrt((x1-x2)^2+(y1-y2)^2)
#2、距离从低到高排序,选前5个
#3、看5个样本点中-1和1的类别数量,谁的数量多判断为哪一类

"""1、计算x到所有样本点的距离---sqrt((x1-x2)^2+(y1-y2)^2)"""
listdistance = []
for t in T:  ## t是每条电影的数据
    dis = np.sum((np.array(t[:-1]) - np.array(x_test)) ** 2) ** 0.5
    listdistance.append([dis, t[-1]])

# print(listdistance)
# [[20.518284528683193, -1], 
# [18.867962264113206, -1], 
# [19.235384061671343, -1], 
# [115.27792503337315, 1], 
# [117.41379816699569, 1], 
# [118.92854997854805, 1]]

"""2、距离从低到高排序,选前5个"""
##按照dis进行排序
listdistance.sort()
# print(listdistance)
# [[18.867962264113206, -1], 
# [19.235384061671343, -1], 
# [20.518284528683193, -1], 
# [115.27792503337315, 1], 
# [117.41379816699569, 1], 
# [118.92854997854805, 1]]

listdistance=listdistance[:K]

"""3、看5个样本点中-1和1的类别数量,谁的数量多判断为哪一类"""
##选取K个邻居放入投票箱
arr = np.array(listdistance[:K])[:, -1]  #所有行,最后一列,降维
# print(arr)
# [-1. -1. -1.  1.  1.]
##统计投票
# 方法1:转成Series,使用value_cou
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值