一、KNN算法
KNN分类算法的思想非常简单,就是k个最近邻多数投票的思想,关键就是在给定的距离量度下快速找到预测实例的最近的k个临近值
常用的距离量度方式包括:闵可夫斯基距离、欧氏距离、曼哈顿距离、切比雪夫距离、余弦距离
优点:精度高、对异常值不敏感、无数据输入假定
缺点:计算复杂度高、空间复杂度高
二、数据集内容
Iris数据集里一共包括150行记录,其中前四列为花萼长度,花萼宽度,花瓣长度,花瓣宽度等4个用于识别鸢尾花的属性,第5列为鸢尾花的类别(包括Setosa,Versicolour,Virginica三类)。
通过判定四个尺寸大小识别类别花朵类别,可通过UCI Machine Learning RepositoryDiscover datasets around the world!http://archive.ics.uci.edu/ml/datasets/Iris
下载数据集
三、代码
1、处理数据集
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.lines as mlines
import operator
# 准备数据:从文本文件中解析数据
def file2matrix(filename):
# 归一化
def autoNorm(dataSet):
改进:在训练过程中发现精度过低,对数据集进行打乱可以提升精度,错误率明显降低
打乱数据集可以提高泛化能力
#打乱数据集
def txt():
with open('iris copy.txt') as f:
content = f.readlines()
import random
random.shuffle(content)#随机排序
match_ran=open("iris copy.txt", "w")
for i in range(150):
match_ran.write(content[i])
原错误率:
修改后错误率:
2、knn算法框架
def classify0(inX, dataSet, labels, k):
rows = dataSet.shape[0] # 计算有多少组特征值
# Step 1: 计算待预测样本与训练数据集中样本特征之间的欧式距离
diff = np.tile(inX, (rows, 1)) - dataSet # tile作用:将pred_data重复rows次
sqrt_dist = np.sum(diff**2, axis=1) # 按行相加,不保持其二维特性
distance = sqrt_dist ** 0.5 #开方
# Step 2: 按照距离递增的顺序排序
sorted_indices = np.argsort(distance)
# Step 3: 选取距离最近的K个样本以及所属类别的次数
map_label = {}
for i in range(k):
label = labels[sorted_indices[i]][0]
map_label[label] = map_label.get(label, 0) + 1
# Step 4: 返回前k个点所出现频率最高的类别作为预测分类结果
max_num = 0
for key, value in map_label.items():
if value > max_num:
max_num = value
ans = key
return ans
欧式距离:
改进:有尝试用其余距离公式,但是效果都不理想
3、散点图显示
用不同颜色表示不同花种,取数据不同特征数值进行散点图绘制
# 数据展示
def showData(datingDataMat, datingLabels):
fig, axs = plt.subplots(nrows=2, ncols=3, sharex=False, sharey=False, figsize=(13, 8))
LabelsColors = []
for i in datingLabels:
if i == 1:
LabelsColors.append('black')
if i == 2:
LabelsColors.append('orange')
if i == 3:
LabelsColors.append('red')
axs[1][2].scatter(x=datingDataMat[:, 2], y=datingDataMat[:, 3], color=LabelsColors, s=15, alpha=.5)
# 设置标题,x轴label,y轴label
axs2_title_text = axs[1][2].set_title('Petal_Length_Width')
axs2_xlabel_text = axs[1][2].set_xlabel('Petal.Lengthh')
axs2_ylabel_text = axs[1][2].set_ylabel('Petal.Width')
plt.setp(axs2_title_text, size=9, weight='bold', color='red')
plt.setp(axs2_xlabel_text, size=7, weight='bold', color='black')
plt.setp(axs2_ylabel_text, size=7, weight='bold', color='black')
4、输入数据进行判断
5、输出结果
四、小结
学习了knn算法和部分距离公式的使用
主要改进措施:
通过对数据集的改动(打乱数据集)提升了训练结果精度
尝试了部分其他距离算法,但是效果不佳
略加大了参与训练的数据集百分比
knn算法模型py库内代码:
# 构建模型
model = neighbors.KNeighborsClassifier(n_neighbors=3)
model.fit(x_train, y_train)
prediction = model.predict(x_test)