乐趣区

关于机器学习:机器学习KNN

前言

KNN 能够说是最简略的分类算法之一,同时也是最罕用的分类算法之一。KNN 算法是有 监督学习 的分类算法,与机器学习算法 Kmeans 有点像,但却是有本质区别的

定义
  • 一个样本 a 在特色空间中离它最近的 K 个最近的样本中,大多数属于某个类别,则a 样本也属于这个类别
  • 如何计算其余样本与 a 样本的间隔?

    • 个别时候咱们应用 欧式间隔
    • 二维空间:$p =\sqrt{(x_2-x_1)^2+(y_2-y_1)^2}$
    • N 维空间:$p = \sqrt{\sum_{i=0}^{n}(x_i-y_i)^2}$
K 值的抉择
  • K 值过小 容易受到异样点的影响
  • K 值过大 容易受到样本平衡的问题
  • 如何抉择 K 值

    • 应用穿插验证
KNN 流程步骤
  1. 计算 样本 a 与训练集中每个样本点的间隔(欧式间隔)
  2. 对计算出来的所有间隔进行排序
  3. 选取前 K 个最小间隔的样本
  4. 依据 K 个样本中哪个类别多,样本 a 就属于哪个类别
代码

导入应用包 numpy matplotlib Counter

from collections import Counter
import matplotlib.pyplot as plt
import numpy as np

应用 loadtxt 加载数据 数据样本 前两列为特征值,最初一列为标签值

x_new 为新样本

data = np.loadtxt("exe2.txt",delimiter=',')

x = data[:,:2]
y = data[:,-1]

x_new = np.array([70.534788289883,50.8558115276420])

画图展现

plt.scatter(x[y==0, 0], x[y==0, 1], color='r')
plt.scatter(x[y==1, 0], x[y==1, 1], color='g')
plt.scatter(x_new[0], x_new[1], color='b')
plt.show()

list 用于贮存 新样本点到每个样本的间隔

argsort 函数 会将元素从小到大排序,并返回索引

list = []

for i in x:
    distance = np.sqrt(np.sum(i - x_new)**2)
    list.append(distance)

list_sort = np.argsort(list)
print(list_sort)

k = 6

ten_y = [y[i] for i in list_sort[:k]]

print(Counter(ten_y))
残缺代码
from collections import Counter
import matplotlib.pyplot as plt
import numpy as np

data = np.loadtxt("exe2.txt",delimiter=',')

x = data[:,:2]
y = data[:,-1]

x_new = np.array([70.534788289883,50.8558115276420])


#  0 类用红色示意  1 类用绿色示意   新样本用 蓝色示意
plt.scatter(x[y==0, 0], x[y==0, 1], color='r')
plt.scatter(x[y==1, 0], x[y==1, 1], color='g')
plt.scatter(x_new[0], x_new[1], color='b')
plt.show()

# 用于报存间隔
list = []

for i in x:
    distance = np.sqrt(np.sum(i - x_new)**2)
    list.append(distance)

list_sort = np.argsort(list)
print(list_sort)

k = 6

ten_y = [y[i] for i in list_sort[:k]]

print(Counter(ten_y))
退出移动版