简介:
顾名思义,KNN(K Near Neighbor):k个最近的邻居,即每个样本都可以用它最接近的k个邻居来代表。
具体步骤:
1.根据数据来确定合适的K。
2.选取距离目标最近的K个数据。
3.根据K个数据的类型预测目标。
具体示例:
使用k-nn算法分类一个电影是爱情片还是动作片。
电影名称 | 亲吻镜头 | 打斗镜头 | 电影类型 |
一 | 104 | 3 | 爱情片 |
二 | 100 | 2 | 爱情片 |
三 | 81 | 1 | 爱情片 |
四 | 10 | 101 | 动作片 |
五 | 5 | 99 | 动作片 |
六 | 2 | 98 | 动作片 |
七 | 90 | 18 | ? |
1.随机取K为 3
2.计算电影七到其他电影的距离
电影名称 | 到电影七的距离 |
一 | 20.5 |
二 | 18.7 |
三 | 19.2 |
四 | 115.3 |
五 | 117.4 |
六 | 118.9 |
3.根据距离排序:18.7>19.2>20.5>115.3。显然电影七属于爱情片。
代码:
import matplotlib.pyplot as plt
import numpy as np
from math import sqrt
arr = np.array([[3, 104], [2, 100], [1, 81], [101, 10], [99, 5], [98, 2]])
x = arr[:, 0]
y = arr[:, 1]
plt.scatter(x[:3], y[:3], color='blue')
plt.scatter(x[3:], y[3:], color='orange')
plt.scatter(90, 18, color='red')
plt.xlim(0, 110)
plt.ylim(0, 120)
plt.xlabel('Action')
plt.ylabel('Kiss')
plt.show()
def fun(x1, y1):
d = sqrt((x1 - 18) ** 2 + (y1 - 90) ** 2)
return d
a = []
b = []
m = n = 0
for i in range(6):
a.append(fun(arr[i, 0], arr[i, 1]))
b.append(fun(arr[i, 0], arr[i, 1])) # 用来装原始数据
for j in range(6):
for i in range(6 - 1 - j):
if a[i] > a[i + 1]:
a[i], a[i + 1] = a[i + 1], a[i]
for i in range(3):
for j in range(3):
if a[j] == b[i]:
m = m + 1
if a[j] == b[i + 3]:
n = n + 1
if m > n:
print("电影七是爱情片")
else:
print("电影七是动作片")