KNN——鸢尾花识别

一、KNN算法

KNN分类算法的思想非常简单,就是k个最近邻多数投票的思想,关键就是在给定的距离量度下快速找到预测实例的最近的k个临近值

常用的距离量度方式包括:闵可夫斯基距离、欧氏距离、曼哈顿距离、切比雪夫距离、余弦距离

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

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

二、数据集内容

Iris数据集里一共包括150行记录,其中前四列为花萼长度,花萼宽度,花瓣长度,花瓣宽度等4个用于识别鸢尾花的属性,第5列为鸢尾花的类别(包括Setosa,Versicolour,Virginica三类)。

通过判定四个尺寸大小识别类别花朵类别,可通过UCI Machine Learning RepositoryDiscover datasets around the world!icon-default.png?t=N7T8http://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

欧式距离:

D=\left ( \left ( xi-xj \right )^{2}+\left ( yi-yj \right )^{2} \right )^{1/2}

改进:有尝试用其余距离公式,但是效果都不理想

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)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值