knn算法预测鸢尾花的种类

1、相关 python 库函数导入:

# 导包
import numpy as np
import operator as op
from sklearn.datasets import load_iris						  #导入数据所需库
from sklearn.model_selection import train_test_split    #数据分割所需库

2、原始数据的生成以及数据处理:

iris_dataset = load_iris()

# 查看数据说明。
print(iris_dataset.DESCR)

# 将数据分割(分为训练集和测试集)
from sklearn.model_selection import train_test_split

'''
一共150组数据:
    112个训练数据;
    38个测试数据;
'''
X_train, X_test, y_train, y_test = train_test_split(
    iris_dataset['data'], iris_dataset['target'], random_state=0
)

3、自定义 knn 算法实现单个鸢尾花种类的预测:

'''
自定义 knn 算法:
    new_data:待预测数据
    old_data_x:输入的训练数据集(x_train)
    old_data_y:输入的训练集的类别标签(y_train)
    k:临近数
'''

def KNNClass(new_data, old_data_x, old_data_lables, k):
    Sample = old_data_x.shape[0]
    # 计算预测数据与已知数据的距离
    # distance = ((np.tile(new_data,(old_data,1)) - old_data)**2)**0.5
    diffMat = np.tile(new_data, (Sample, 1)) - old_data_x  # numpy.tile进行数组的重复生成
    sqdiffMat = diffMat ** 2
    sqDistances = sqdiffMat.sum(axis=1)
    distances = sqDistances ** 0.5
    sortedDistIndicies = distances.argsort()  # 返回的是数组值从小到大的索引值
    classCount = {}
    for i in range(k):
        # 第i个近邻点在distance数组中的索引,对应的分类
        votelabel = old_data_lables[sortedDistIndicies[i]]
        classCount[votelabel] = classCount.get(votelabel, 0) + 1
    sortedClassCount = sorted(classCount.items(), key=op.itemgetter(1), reverse=True)

    return sortedClassCount[0][0]

4、利用 KNNClass (自定义knn算法) 预测所有的鸢尾花种类:

# 一共 38 组测试数据,使用自定义 KNNClass 来计算准确率
count = 0     #计算正确的个数
list_KNNClass = []   # KNNClass 得到的结果
for i in range(38):
    list_KNNclass = KNNClass(arry_x_test[i], arry_x_train, arry_y_train, 5)
    if list_KNNclass == y_test[i]:   # 5 临近
        list_KNNClass.append(list_KNNclass)
        count +=1
    else:
        continue

5、输出相应的结果集:

print("KNNClass 得到的结果为:{}".format(list_KNNClass))

print("测试数据:{}".format(y_test))

print("KNNClass 准确率为:{:.2f}".format(count/38))

完整代码如下:

# 导包
import numpy as np
import operator as op

# 导入数据
from sklearn.datasets import load_iris

iris_dataset = load_iris()

# 查看数据说明。
print(iris_dataset.DESCR)

# 将数据分割(分为训练集和测试集)
from sklearn.model_selection import train_test_split

'''
一共150组数据:
    112个训练数据;
    38个测试数据;
'''
X_train, X_test, y_train, y_test = train_test_split(
    iris_dataset['data'], iris_dataset['target'], random_state=0
)


'''
自定义 knn 算法:
    new_data:待预测数据
    old_data_x:输入的训练数据集(x_train)
    old_data_y:输入的训练集的类别标签(y_train)
    k:临近数
'''

def KNNClass(new_data, old_data_x, old_data_lables, k):
    Sample = old_data_x.shape[0]
    # 计算预测数据与已知数据的距离
    # distance = ((np.tile(new_data,(old_data,1)) - old_data)**2)**0.5
    diffMat = np.tile(new_data, (Sample, 1)) - old_data_x  # numpy.tile进行数组的重复生成
    sqdiffMat = diffMat ** 2
    sqDistances = sqdiffMat.sum(axis=1)
    distances = sqDistances ** 0.5
    sortedDistIndicies = distances.argsort()  # 返回的是数组值从小到大的索引值
    classCount = {}
    for i in range(k):
        # 第i个近邻点在distance数组中的索引,对应的分类
        votelabel = old_data_lables[sortedDistIndicies[i]]
        classCount[votelabel] = classCount.get(votelabel, 0) + 1
    sortedClassCount = sorted(classCount.items(), key=op.itemgetter(1), reverse=True)

    return sortedClassCount[0][0]

# 构建邻居数为 5 的 knn 模型 -------通过自定义 KNNClass
# 1、格式转换--------将 数据集转化为 arry 形式以便计算
arry_x_train = np.array(X_train)
arry_x_test = np.array(X_test)

arry_y_train = np.array(y_train)
arry_y_test = np.array(y_test)


y_true = KNNClass(arry_x_test[10], arry_x_train, arry_y_train, 5)

# 一共 38 组测试数据,使用自定义 KNNClass 来计算准确率
count = 0     #计算正确的个数
list_KNNClass = []   # KNNClass 得到的结果
for i in range(38):
    list_KNNclass = KNNClass(arry_x_test[i], arry_x_train, arry_y_train, 5)
    if list_KNNclass == y_test[i]:   # 5 临近
        list_KNNClass.append(list_KNNclass)
        count +=1
    else:
        continue

print("KNNClass 得到的结果为:{}".format(list_KNNClass))

print("测试数据:{}".format(y_test))

print("KNNClass 准确率为:{:.2f}".format(count/38))

结果截图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值