Skip to main content

K-邻近算法

说明:

这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。

KNN 先记录所有已知数据,再利用一个距离函数,

找出已知数据中距离未知事件最近的 K 组数据,

最后按照这 K 组数据里最常见的类别预测该事件。

示例代码:

from sklearn.neighbors import KNeighborsClassifier
import numpy as np

# 创建示例数据与标签
X = np.array([[1,2], [2,3], [2,5], [3,2], [3,3],[4,5]])
y = np.array([0, 0, 1, 0, 1, 1]) # 标签部分

# 创建K-最近邻分类器
# 选择k的值,表示分类新样本时,对离它最近的3个样本的标签进行分类
k = 3
# fit存储数据与标签,用于之后的预测数据
model = KNeighborsClassifier(n_neighbors=k).fit(X, y)

# 创建需要预测的数据点
new_data_point = np.array([[3, 4]])

# .predicts()方法返回一个数组,数组中包含了预测的类别
predicter_class = model.predict(new_data_point)

print("预测类别:",predicter_class)

简单实例代码:

函数:train_test_split详解

此方法会将数据和标签均分成两部分并打乱,一部分用于训练,一部分用于测试。

所以返回的数据有4个,我们用1、2、3、4给他们做上记号.

数据X [------70%---(1)-- | -30%(2)-] 标签y [------70%---(3)-- | -30%(4)-]

与上图对应,依次是:

训练的数据X(1), 测试的数据X(2), ↑↓ ↑↓ 训练的标签y(3), 测试的标签y(4)

用(1)、(3)喂出一个模型

让模型预测(2),获得预测结果

将预测结果与(4)进行比较来测试模型的准确率

from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split

# 导入鸢尾花数据库
from sklearn.datasets import load_iris

# 加载数据集,数据集包含数据的特征、标签、类别等许多信息
iris = load_iris()

# 获取数据特征(即花的高度、宽度)
iris_X = iris.data

# 获取数据标签(即花的品种,用0、1、2代替)
iris_y = iris.target
print(len(iris_X))

# 把数据打乱,并分成测试数据和训练数据,test_size是测试数据的比例,0.3表达为30%
# 每次执行都会打乱代码,需要固定使用random.status
X_train, X_test, y_train, y_test = train_test_split(iris_X, iris_y, test_size=0.3)

# 查看训练数据,已经被随机打乱了
# print(y_train)

# 实例化KNN分类器
knn = KNeighborsClassifier()

# .fit()方法用于训练模型,即让模型从数据中学习
knn.fit(X_train, y_train)

# .predicts()方法返回一个数组,数组中包含了预测的类别
print(knn.predict(X_test))

# 查看真实数据
print(y_test)

预测准确率:

'''
zip说明:
循环将每一个zip的第一个参数与第二个参数组合成元组
for i in zip(x,y):
print(i)
输出:(x1,y1)
(x2,y2)
...
'''
right = 0
error = 0
# knn.predict(X_test),获取的是预测后的类别数组
# y_test,表示原数据分类后占30%的类别数组
for i in zip(knn.predict(X_test),y_test):
print(i)
if i[0] == i[1]:
right +=1
else:
error +=1
print(right,error)
print('正确率:',(right/(right+error)*100))

准确率改进:

# 等同于上面的准确率循环
print('正确率:{}%'.format(knn.score(X_test,y_test)*100))