MENU

机器学习笔记1:KNN最邻近算法

• October 5, 2019 • Read: 4442 • Knowledge,Python,深度学习

机器学习笔记1:K最邻近法K-Nearest Neighbors

机器学习有两大类问题,一是数据的分类,二是回归问题。对于分类问题来说,KNN法是最简单、最入门的一个方法,该分类方法的思想是近朱者赤近墨者黑,当然这里指的是有监督的学习,即对已有的数据点进行模型的训练,得到的模型去预测新添加的数据的类别,这大概就是分类问题最简单的理解了吧。

对于分类问题,有一点要明白的是,数据点怎么描述?如果说一个对象的数据描述,用2个属性来描述,若分别记做x和y,那么当我们用一个定量的值去表示时,由于只有两个属性值,所以在一个二维平面上就能把对象数据点进行表示,横轴为x的值,纵轴为y的值。由此也可以拓展得到一个更高维的数据形式,当然因为可视化只能最多达到三维空间,所以当一个数据点具有4个及以上的属性时,则无法进行完全的数据可视化展示。

Machine Learning中最易上手入门的库就是scikit-learn这个库,它不能够在GPU上进行张量运算,当数据样本十分庞大时难以进行训练。但是提供的机器学习的算法都是最为基础的。

这个库中,提供了一个学习时的数据集的构造功能,对于学习以及练习都十分有帮助。其中关于分类数据集生成的方式为:

from sklearn.datasets import make_blobs
# make_blobs函数用于分类数据集的产生,以下几个参数是最基本的
# n_samples:样本的数量
# n_features: 样本的属性数量,默认为2
# centers: 这里指生成的数据有几类
# random_sates: 随机状态设定,保证数据可重复
# 注意,他返回的是一个元组
# 第一个元素是一个矩阵,有多少属性就有多少列
# 类型信息为元组的第二个元素,给出了每一个数据点的分类信息

# 为了方便可视化,设定样本属性为2个

X, y = make_blobs(n_samples=400, n_features= 2, centers=4, random_state=14)
import numpy as np
import matplotlib.pyplot as plt

plt.style.use('ggplot')
fig, ax = plt.subplots()
ax.scatter(X[:, 0], X[:, 1], c=y, edgecolor='k', cmap='viridis', s=60)
ax.set_title('2-Dimensional Data Points')
ax.set_xlabel('1th feature')
ax.set_ylabel('2th feature')
fig.savefig('gg1.jpeg', dpi=600)
plt.show()

png1

# 三维空间中对具有三个属性数据进行可视化

X3D, y3d = make_blobs(n_samples=400, n_features=3, centers=4, random_state=14)

from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(X3D[:, 0], X3D[:, 1], X3D[:, 2], c = y3d, edgecolor='k', cmap='viridis', s=60)
ax.set_xlabel('1th feature')
ax.set_ylabel('2th feature')
ax.set_zlabel('3th feature')
ax.set_title('3-Dimensional Data Points')
fig.savefig('gg2.jpeg', dpi=600)
plt.show()

png2

采用KNN法对已有的数据集进行分类模型的训练,scikit-learn中在neighbors模块部分中导入KNeighborsClassifier对象,用于生成分类模型。

from sklearn.neighbors import KNeighborsClassifier
knnc = KNeighborsClassifier()  # 创建KNN对象
knnc.fit(X, y)  # fit是对象的方法,用于模型的训练
# 以上,就完成了模型的训练
# 对于结果进行可视化

x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1  # 确定可视化范围
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1  # 确定可视化范围
xl = np.linspace(x_min, x_max, 200)  # 构建离散点x方向的,200个点
yl = np.linspace(y_min, y_max, 200)  # 构建离散点y方向的,200个点
# 为获得云图,进行区域的栅格化采样
xx, yy = np.meshgrid(xl, yl)
Z = knnc.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape)

fig, ax = plt.subplots()
ax.pcolormesh(xx, yy, Z, cmap='Pastel2')
ax.scatter(X[:, 0], X[:, 1], c=y, edgecolor='k', s=60, cmap='viridis')
ax.set_title('KNN Classifier')
fig.savefig('gg3.jpeg', dpi=600)
plt.show()

png3

KNN算法很简单,但是在实际当中很少会用到它,它对于数据的预处理要求较高,对高维的数据的拟合较差,所以很少会用到。

Last Modified: October 15, 2019
Archives Tip
QR Code for this page
Tipping QR Code