kNN

kNN — k近邻算法

K Nearest Neighbor,也称为k近邻算法 ,可以这样理解它:

  1. 先读出一堆分好类的数据点,每一个数据点在坐标轴上都有一个位置,标记他们的分类
  2. 归一化数据
  3. 计算我们要预测的数据 X 到每个数据点的距离,并且排序
  4. 选取与X点最近的K个点,确定哪个分类的出现次数最多,那么我们就预测这个数据 X 属于这个出现次数最多的分类

简单地说,k近邻算法采用测量不同特征值之间的距离方法进行分类。

​ 优点:精度高、对异常值不敏感、无数据输入假定。

​ 缺点:计算复杂度高、空间复杂度高。

​ 适用数据范围:数值型和标称型。

类别分析

例:

导入包

1
2
3
4
5
6
7
8
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
%matplotlib inline

# KNeighborsClassifier分类模型,可以处理分类问题
from sklearn.neighbors import KNeighborsClassifier
1
2
3
# 获取数据
samples = pd.read_excel('films.xlsx')
samples

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 获取特征集合和标签集合
train = samples[['动作镜头','谈情镜头']]
target = samples['类别']

# 构建算法模型对象
# n_neighbors一般为奇数
knn = KNeighborsClassifier(n_neighbors=5)

# 训练算法模型
knn.fit(train,target)
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=1, n_neighbors=5, p=2,
weights='uniform')


# 预测数据
X_test = np.array([[3,18],[23,5]])
y_ = knn.predict(X_test)


# 绘制样本空间
def transform_target(x):
if x == '动作':
return 1
else:
return 0

number_target = target.map(transform_target)
plt.scatter(train.values[:,0],train.values[:,1],c=number_target)
plt.scatter(X_test[:,0],X_test[:,1])
plt.xlabel('action')
plt.ylabel('love')
>>>

1
2
3
4
5
# k值的取值范围 不大于样本集数量的平方根
knn1 = KNeighborsClassifier(n_neighbors=3)
knn1.fit(train,target)
X_test = np.array([[3,18],[23,5],[90,1]])
knn1.predict(X_test)

KNN处理回归

例:

1
2
3
4
5
6
7
8
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
%matplotlib inline

# 回归模型
from sklearn.neighbors import KNeighborsRegressor
1
2
3
4
# 生成一组符合正弦分布的数据样本点,x就是样本,y样本标签
x = np.linspace(0,2*np.pi,40)
y = np.sin(x)
plt.scatter(x,y)

1
2
# 创建噪音数据,模拟真实环境
noise = np.random.random(size=20)*0.6-0.3
1
2
3
# 把噪音数据添加到样本标签中,查看包含噪声的数据分布情况
y[::2] += noise
plt.scatter(x,y)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 分别训练三种不同k值的knn回归器,预测结果,查看预测情况
knn1 = KNeighborsRegressor(n_neighbors=5)
knn1.fit(x.reshape(-1,1),y)
knn2 = KNeighborsRegressor(n_neighbors=1)
knn2.fit(x.reshape(-1,1),y)
knn3 = KNeighborsRegressor(n_neighbors=15)
knn3.fit(x.reshape(-1,1),y)

X_test = np.linspace(x.min(),x.max(),100).reshape(-1,1)
y1_ = knn1.predict(X_test)
y2_ = knn2.predict(X_test)
y3_ = knn3.predict(X_test)

# 红色线属于过拟合 产生原因:对样本数据学习太完美,受到一些个体特影响
# 蓝色线属于欠拟合 产生原因:对数据样本学习不够详细,没有学习到普遍特征
# 黄色线属于最佳拟合,
plt.plot(X_test,y1_,label='preidct k=5',color='orange')
plt.plot(X_test,y2_,label='preidct k=1',color='red')
plt.plot(X_test,y3_,label='preidct k=15',color='cyan')
plt.scatter(x,y,label='true_data',color='blue')
plt.legend()

0%