KNN算法是机器学习算法中用于分类或者回归的算法,KNN全称为K nearest neighbour(又称为K-近邻算法)
原理:K-近邻算法采用测量不同特征值之间的距离的方法进行分类。
优点:精度高
缺点:时间和空间复杂度高
K近邻算法思想:有N个样本分布在m个类别中,要判定第x个样本为什么类别,就要求出x到N个样本每个样本的距离集合,从中找出K个最近的样本,然后通过k个样本的比例判断x所属类别,例如在k个样本中第一类占比较多,就判定x是第一类数据。注意:计算x到N个样本之间的距离方法有两种,第一种是曼哈顿距离,第二种是欧式距离,他们的计算如下:
可以看出,曼哈顿距离计算复杂度较低,计算速度快。
实现方法:基于谷歌公司开发的第三方python库sklearn
实现步骤:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 导入KNN分类库
from sklearn.neighbors import KNeighborsClassifier
# 1、导入数据
movie = pd.read_excel('./tests.xlsx',sheet_name="Sheet2")
# 2、数据可视化
plt.scatter(movie.loc[:,'武打镜头'],movie.loc[:,'接吻镜头'])
plt.show
# 3、训练数据赋值,x(二维)、y(一维)
x_train = movie.loc[:,['武打镜头','接吻镜头']]
y_train = movie.loc[:,'分类情况']
print(type(x_train),type(y_train))
# 4、设置KNN参数(近邻数量为5,距离计算方法为曼哈顿),引入KNN模型
KNN = KNeighborsClassifier(n_neighbors=5,p=1)
# 5、训练模型
KNN.fit(x_train,y_train)
# 6、设置测试数据测试训练完的KNN模型
x_test = np.array([[30,2],[3,36],[2,15],[30,2]])
y_test = np.array(['动作片','爱情片','爱情片','动作片'])
y_pred = KNN.predict(x_test)
print(y_pred)
# 7、计算测试集准确率(accuracy)
KNN.score(x_test,y_test)
# 获取输入数据
data = s_data['data']
pd.DataFrame(data)
# 获取输出数据
target = s_data['target']
# 导入sklearn自带的切分训练数据和测试数据的包
from sklearn.model_selection import train_test_split
# 将数据切分为训练集输入、训练集输出、测试集输入、测试集输出
# test_size的参数如果是整数就会从所有数据中取多少条作为测试数据
# test_size的参数如果是0~1的小数就会从所有数据中按比例取多少条作为测试数据
# random_state参数可以让每次数据切分都一样
x_train, x_test, y_train, y_test = train_test_split(data,target,test_size=10)
# 获取KNN算法
KNN = KNeighborsClassifier()
# 训练KNN算法
model = KNN.fit(x_train,y_train)
# 测试模型分类效果
model.predict(x_test)
print(y_test)
# 计算分类准确度
model.score(x_test,y_test)
s_data = load_iris()
# 获取输入数据
data = s_data['data']
data = pd.DataFrame(data,columns=s_data['feature_names'])
# 用DataFrame直接画图查看数据集
data.plot()
# 1、先划分坐标系
x = np.linspace(data2.iloc[:, 0].min(), data2.iloc[:, 0].max(), 1000) # 把x等分成1000份
y = np.linspace(data2.iloc[:, 1].min(), data2.iloc[:, 1].max(), 1000) # 把y等分成1000份
X, Y = np.meshgrid(x, y) # 按行复制y个x,按列复制x个y
XY = np.c_[X.ravel(), Y.ravel()] # 将x扁平化,将y扁平化,再一对一组合,最终XY形状为(1000000, 2)
# 用KNN模型预测
knn = KNeighborsClassifier()
knn.fit(data2, target)
y_pred = knn.predict(XY)
y_pred
# 分界图
plt.scatter(XY[:, 0], XY[:, 1], c=y_pred)
注意:上面绘图需要等待,可以使用matplotlib自带的绘图函数,绘图就不用等待了。
pcolormesh(): 画分界图,边界图
plt.pcolormesh(X, Y, y_pred.reshape(1000, 1000))
# 保存模型
import joblib
joblib.dump(模型名称,"模型存储路径.plk")
# 加载模型
import joblib
joblib.load("模型存储路径.plk")