KNN算法基础 机器学习基础1 python人工智能

上一篇:机器学习简介 扫盲版 机器学习基础0 python人工智能

目录

简介

数学基础

[1. 欧氏距离(Euclidean Distance)](#1. 欧氏距离(Euclidean Distance))

[2. 曼哈顿距离(Manhattan Distance)](#2. 曼哈顿距离(Manhattan Distance))

[3. 切比雪夫距离(Chebyshev Distance)](#3. 切比雪夫距离(Chebyshev Distance))

[4. 闵氏距离(Minkowski Distance)](#4. 闵氏距离(Minkowski Distance))

分类思想

回归思想

特征值预处理

归一化

标准化

案例:鸢尾花

dm01_load_iris()输出:

dm02_show_iris()输出:

dm03_split_train_test()输出:

dm04_iris_evaluate_test()输出:

简介

K 近邻(K-Nearest Neighbor,KNN)是一种基于 "相似样本具有相似标签"的简单机器学习算法,既可以做分类也能做回归。核心逻辑是:对新样本,计算它与训练集中所有样本的距离,取距离最近的 K 个样本("邻居"),用这 K 个样本的标签来推断新样本的结果。

数学基础

KNN 通过 "计算样本间距离" 找邻居,常用这 4 种距离:

1. 欧氏距离(Euclidean Distance)

最常用的 "直线距离",适合数值型特征

2. 曼哈顿距离(Manhattan Distance)

也叫 "城市街区距离",模拟 "水平 + 垂直" 的移动路径:

3. 切比雪夫距离(Chebyshev Distance)

模拟 "国际象棋中王的移动"(走最少步数),取各维度差的最大值:

4. 闵氏距离(Minkowski Distance)

前 3 种距离的 "统一形式",由参数p控制:

分类思想

KNN 分类的核心是"少数服从多数",步骤如下:

  1. 计算新样本(X_test)与所有训练样本(X_train)的距离(常用欧氏距离);
  2. 对距离排序,选取最近的 K 个训练样本;
  3. 统计这 K 个样本中出现次数最多的标签,作为新样本的预测分类。

K 值选择技巧:

  • K 太小:模型易过拟合(对噪声敏感);
  • K 太大:模型欠拟合(忽略局部特征);
  • 常用交叉验证、网格搜索确定最优 K(比如 K=√样本数)。
python 复制代码
# 1. 导包.
from sklearn.neighbors import KNeighborsClassifier # 分类
# from sklearn.neighbors import KNeighborsRegressor # 回归

# 2. 准备数据集(测试集 和 训练集)
# train: 训练集
# test: 测试集
# neighbors: 最近邻的邻居数
x_train = [[0], [1], [2], [3]]  # 训练集的特征数据, 因为特征可以有多个特征, 所以是一个二维数组
y_train = [0, 0, 1, 1]  # 训练集的标签数据, 因为标签是离散的, 所以是一个一维数组
x_test = [[5]]  # 测试集的特征数据

# 3. 创建(KNN 分类模型)模型对象.
estimator=KNeighborsClassifier(n_neighbors=3)

# 4. 模型训练.
# 传入: 训练集的特征数据, 训练集的标签数据
estimator.fit(x_train, y_train)

# 5. 模型预测.
# 传入: 测试集的特征数据, 获取到: 预测结果(测试集的标签, y_test)
y_test=estimator.predict(x_test)

# 6. 打印预测结果.
print(f'预测值为: {y_test}') # 预测值为: [1]

回归思想

KNN 回归的逻辑与分类类似,区别是用 "平均值" 代替 "多数投票"

  1. 同样计算新样本与训练样本的距离,选最近的 K 个邻居;
  2. 取这 K 个邻居的标签平均值,作为新样本的预测值。
python 复制代码
# 1. 导包
from sklearn.neighbors import KNeighborsRegressor

# 2. 准备数据集
x_train=[[0, 0, 1], [1, 1, 0], [3, 10, 10], [4, 11, 12]]
y_train=[0.1, 0.2, 0.3, 0.4]
x_test=[[3, 11, 10]]

# 3. 创建模型对象
estimator=KNeighborsRegressor(n_neighbors=2)

# 4. 模型训练
estimator.fit(x_train, y_train)

# 5. 模型预测
y_test=estimator.predict(x_test)

# 6. 预测结果
print(f'预测值为: {y_test}')

特征值预处理

特征的单位 / 数值范围差异会 "干扰距离计算"(比如 "身高(米)" 和 "体重(千克)" 的数值差异会让体重主导距离),因此需要先对特征做预处理。

归一化

归一化是将特征映射到指定区间(默认 0,1,公式为:

*示例:*原数据:\[90,2, 60,4, 75,3]

  • 第一列(90、60、75):min=60,max=90 → 映射后:(90-60)/30=1,(60-60)/30=0,(75-60)/30=0.5
  • 第二列(2、4、3):min=2,max=4 → 映射后:0、1、0.5最终归一化结果:\[1,0, 0,1, 0.5,0.5]
python 复制代码
# 归一化的步骤:
from sklearn.preprocessing import MinMaxScaler,StandardScaler # 归一化对象

# 1. 准备数据集(归一化之前的原数据).
x_train = [[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]]

# 2. 创建归一化对象.
# 参数feature_range 表示生成范围, 默认为: 0, 1  如果就是这个区间, 则参数可以省略不写.
transfer = MinMaxScaler()
# transfer = MinMaxScaler(feature_range=(3,5))

# 3. 对原数据集进行归一化操作.
x_train_new=transfer.fit_transform(x_train)

# 4. 打印处理后的数据.
print('归一化后的数据集为: \n')
print(x_train_new)

输出:

标准化

标准化是将特征转换为均值 = 0、方差 = 1 的正态分布,公式为:

(其中 mean 是特征均值,σ 是特征标准差)

适用场景: 数据分布较分散、存在极端值的情况(比如身高数据中包含异常值)。

python 复制代码
# 1. 准备数据集
x_train = [[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]]

# 2. 创建标准化对象.
transfer = StandardScaler()

# 3. 对原数据集进行标准化操作.
x_train_new = transfer.fit_transform(x_train)

# 4. 打印处理后的数据.
print('标准化后的数据集为: \n')
print(x_train_new)

# 5. 打印数据集的均值和方差.
print(f'数据集的均值为: {transfer.mean_}')
print(f'数据集的方差为: {transfer.var_}')
print(f'数据集的标准差为: {transfer.scale_}')

输出:

案例:鸢尾花

python 复制代码
# 导包
from sklearn.datasets import load_iris # 加载鸢尾花测试集的.
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split # 分割训练集和测试集
from sklearn.metrics import accuracy_score  # 模型评估的, 计算模型预测的准确率
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 加载鸢尾花数据集,并查看数据
def dm01_load_iris():
    # 加载鸢尾花数据集.
    iris_data=load_iris()

    # print(f'数据集:{iris_data}')  # 字典
    print(f'所有的键:{iris_data.keys()}') # ['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename']
    print(f'具体数据:{iris_data.data}')
    print(f'标签:{iris_data.target}')
    print(f'标签对应的名称:{iris_data.target_names}')
    print(f'特征对应的名称:{iris_data.feature_names}')

# 绘制数据集的散点图
def dm02_show_iris():
    # 加载数据集.
    iris_data = load_iris()
    # 把 鸢尾花数据集封装成 DataFrame对象.
    iris_df=pd.DataFrame(iris_data.data, columns=iris_data.feature_names)
    # print(f'iris_df:\n{iris_df}')
    # 给df对象新增1列 -> 标签列.
    iris_df['label']=iris_data.target
    # print(iris_df)

    # 通过 Seaborn绘制散点图.
    # 参1: 数据集. 参2: x轴. 参3: y轴. 参4: 分组字段. 参5: 是否显示拟合线.
    sns.lmplot(data=iris_df, x='sepal length (cm)', y='sepal width (cm)', hue='label', fit_reg=True)
    # 设置标题, 显式.
    plt.title('iris data')
    plt.tight_layout() # 自动调整子图参数, 以使整个图像的边界与子图匹配.
    plt.show()

# 切分训练集和测试集
def dm03_split_train_test():
    # 加载数据集.
    iris_data = load_iris()

    # 数据的预处理: 从150个特征和标签中, 按照 8:2的比例, 切分训练集和测试集.
    # 参1: 特征数据. 参2: 标签数据. 参3: 测试集的比例.  参4: 随机种子(种子一致, 每次生成的随机数据集都是固定的)
    # 返回值: 训练集的特征数据, 测试集的特征数据, 训练集的标签数据, 测试集的标签数据.
    x_train, x_test, y_train, y_test = train_test_split(iris_data.data, iris_data.target, test_size=0.2, random_state=23)

    # 打印切割后的结果.
    print(f'训练集的特征: {x_train}, 个数: {len(x_train)}')
    print(f'训练集的标签: {y_train}, 个数: {len(y_train)}')
    print(f'测试集的特征: {x_test}, 个数: {len(x_test)}')
    print(f'测试集的标签: {y_test}, 个数: {len(y_test)}')

# 定义函数, 实现鸢尾花完整案例 -> 加载数据, 数据预处理, 特征工程, 模型训练, 模型评估, 模型预测.
def dm04_iris_evaluate_test():
    # 加载数据集.
    iris_data = load_iris()
    # 拆分训练集和测试集.
    x_train, x_test, y_train, y_test = train_test_split(iris_data.data, iris_data.target, test_size=0.2, random_state=23)

    # 特征工程(提取, 预处理...)
    # 标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)

    # 模型训练.
    estimator = KNeighborsClassifier(n_neighbors=3)
    estimator.fit(x_train, y_train)

    # 模型预测.
    y_pre = estimator.predict(x_test)
    print(f'预测值为: {y_pre}')

    # 自定义的测试数据
    my_data = [[7.8, 2.1, 3.9, 1.6]]
    # 标准化
    my_data = transfer.transform(my_data)
    # 模型预测.
    y_pre_new = estimator.predict(my_data)
    print(f'自定义测试集预测值为: {y_pre_new}')

    # 5.4 查看上述数据集, 每种分类的预测概率.
    y_pre_proba = estimator.predict_proba(my_data)
    print(f'(各分类)预测概率为: {y_pre_proba}')  # [[0, 0.66666667, 0.33333333]] -> 0分类的概率, 1分类的概率, 2分类的概率.

    # 模型评估.
    # 方式1: 直接评分, 基于: 测试集的特征 和 测试集集的标签.
    print(f'直接评分:正确率(准确率): {estimator.score(x_test, y_test)}')  # 0.9666666666666667
    # 方式2: 基于 测试集的标签 和 预测结果 进行评分.
    print(f'预测结果和测试集标签:正确率(准确率): {accuracy_score(y_test, y_pre)}')  # 0.9666666666666667


# 测试
if __name__ == '__main__':
    # dm01_load_iris()
    # dm02_show_iris()
    # dm03_split_train_test()
    dm04_iris_evaluate_test()

dm01_load_iris()输出:

太长了不好截图,这里复制过来折叠一下

python 复制代码
所有的键:dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename', 'data_module'])
具体数据:[[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]
 [4.7 3.2 1.3 0.2]
 [4.6 3.1 1.5 0.2]
 [5.  3.6 1.4 0.2]
 [5.4 3.9 1.7 0.4]
 [4.6 3.4 1.4 0.3]
 [5.  3.4 1.5 0.2]
 [4.4 2.9 1.4 0.2]
 [4.9 3.1 1.5 0.1]
 [5.4 3.7 1.5 0.2]
 [4.8 3.4 1.6 0.2]
 [4.8 3.  1.4 0.1]
 [4.3 3.  1.1 0.1]
 [5.8 4.  1.2 0.2]
 [5.7 4.4 1.5 0.4]
 [5.4 3.9 1.3 0.4]
 [5.1 3.5 1.4 0.3]
 [5.7 3.8 1.7 0.3]
 [5.1 3.8 1.5 0.3]
 [5.4 3.4 1.7 0.2]
 [5.1 3.7 1.5 0.4]
 [4.6 3.6 1.  0.2]
 [5.1 3.3 1.7 0.5]
 [4.8 3.4 1.9 0.2]
 [5.  3.  1.6 0.2]
 [5.  3.4 1.6 0.4]
 [5.2 3.5 1.5 0.2]
 [5.2 3.4 1.4 0.2]
 [4.7 3.2 1.6 0.2]
 [4.8 3.1 1.6 0.2]
 [5.4 3.4 1.5 0.4]
 [5.2 4.1 1.5 0.1]
 [5.5 4.2 1.4 0.2]
 [4.9 3.1 1.5 0.2]
 [5.  3.2 1.2 0.2]
 [5.5 3.5 1.3 0.2]
 [4.9 3.6 1.4 0.1]
 [4.4 3.  1.3 0.2]
 [5.1 3.4 1.5 0.2]
 [5.  3.5 1.3 0.3]
 [4.5 2.3 1.3 0.3]
 [4.4 3.2 1.3 0.2]
 [5.  3.5 1.6 0.6]
 [5.1 3.8 1.9 0.4]
 [4.8 3.  1.4 0.3]
 [5.1 3.8 1.6 0.2]
 [4.6 3.2 1.4 0.2]
 [5.3 3.7 1.5 0.2]
 [5.  3.3 1.4 0.2]
 [7.  3.2 4.7 1.4]
 [6.4 3.2 4.5 1.5]
 [6.9 3.1 4.9 1.5]
 [5.5 2.3 4.  1.3]
 [6.5 2.8 4.6 1.5]
 [5.7 2.8 4.5 1.3]
 [6.3 3.3 4.7 1.6]
 [4.9 2.4 3.3 1. ]
 [6.6 2.9 4.6 1.3]
 [5.2 2.7 3.9 1.4]
 [5.  2.  3.5 1. ]
 [5.9 3.  4.2 1.5]
 [6.  2.2 4.  1. ]
 [6.1 2.9 4.7 1.4]
 [5.6 2.9 3.6 1.3]
 [6.7 3.1 4.4 1.4]
 [5.6 3.  4.5 1.5]
 [5.8 2.7 4.1 1. ]
 [6.2 2.2 4.5 1.5]
 [5.6 2.5 3.9 1.1]
 [5.9 3.2 4.8 1.8]
 [6.1 2.8 4.  1.3]
 [6.3 2.5 4.9 1.5]
 [6.1 2.8 4.7 1.2]
 [6.4 2.9 4.3 1.3]
 [6.6 3.  4.4 1.4]
 [6.8 2.8 4.8 1.4]
 [6.7 3.  5.  1.7]
 [6.  2.9 4.5 1.5]
 [5.7 2.6 3.5 1. ]
 [5.5 2.4 3.8 1.1]
 [5.5 2.4 3.7 1. ]
 [5.8 2.7 3.9 1.2]
 [6.  2.7 5.1 1.6]
 [5.4 3.  4.5 1.5]
 [6.  3.4 4.5 1.6]
 [6.7 3.1 4.7 1.5]
 [6.3 2.3 4.4 1.3]
 [5.6 3.  4.1 1.3]
 [5.5 2.5 4.  1.3]
 [5.5 2.6 4.4 1.2]
 [6.1 3.  4.6 1.4]
 [5.8 2.6 4.  1.2]
 [5.  2.3 3.3 1. ]
 [5.6 2.7 4.2 1.3]
 [5.7 3.  4.2 1.2]
 [5.7 2.9 4.2 1.3]
 [6.2 2.9 4.3 1.3]
 [5.1 2.5 3.  1.1]
 [5.7 2.8 4.1 1.3]
 [6.3 3.3 6.  2.5]
 [5.8 2.7 5.1 1.9]
 [7.1 3.  5.9 2.1]
 [6.3 2.9 5.6 1.8]
 [6.5 3.  5.8 2.2]
 [7.6 3.  6.6 2.1]
 [4.9 2.5 4.5 1.7]
 [7.3 2.9 6.3 1.8]
 [6.7 2.5 5.8 1.8]
 [7.2 3.6 6.1 2.5]
 [6.5 3.2 5.1 2. ]
 [6.4 2.7 5.3 1.9]
 [6.8 3.  5.5 2.1]
 [5.7 2.5 5.  2. ]
 [5.8 2.8 5.1 2.4]
 [6.4 3.2 5.3 2.3]
 [6.5 3.  5.5 1.8]
 [7.7 3.8 6.7 2.2]
 [7.7 2.6 6.9 2.3]
 [6.  2.2 5.  1.5]
 [6.9 3.2 5.7 2.3]
 [5.6 2.8 4.9 2. ]
 [7.7 2.8 6.7 2. ]
 [6.3 2.7 4.9 1.8]
 [6.7 3.3 5.7 2.1]
 [7.2 3.2 6.  1.8]
 [6.2 2.8 4.8 1.8]
 [6.1 3.  4.9 1.8]
 [6.4 2.8 5.6 2.1]
 [7.2 3.  5.8 1.6]
 [7.4 2.8 6.1 1.9]
 [7.9 3.8 6.4 2. ]
 [6.4 2.8 5.6 2.2]
 [6.3 2.8 5.1 1.5]
 [6.1 2.6 5.6 1.4]
 [7.7 3.  6.1 2.3]
 [6.3 3.4 5.6 2.4]
 [6.4 3.1 5.5 1.8]
 [6.  3.  4.8 1.8]
 [6.9 3.1 5.4 2.1]
 [6.7 3.1 5.6 2.4]
 [6.9 3.1 5.1 2.3]
 [5.8 2.7 5.1 1.9]
 [6.8 3.2 5.9 2.3]
 [6.7 3.3 5.7 2.5]
 [6.7 3.  5.2 2.3]
 [6.3 2.5 5.  1.9]
 [6.5 3.  5.2 2. ]
 [6.2 3.4 5.4 2.3]
 [5.9 3.  5.1 1.8]]
标签:[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2]
标签对应的名称:['setosa' 'versicolor' 'virginica']
特征对应的名称:['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']

dm02_show_iris()输出:

dm03_split_train_test()输出:

太长了不好截图,这里复制过来折叠一下

python 复制代码
训练集的特征: [[4.9 3.1 1.5 0.1]
 [5.2 2.7 3.9 1.4]
 [5.4 3.9 1.3 0.4]
 [7.7 2.8 6.7 2. ]
 [5.  3.4 1.5 0.2]
 [5.4 3.9 1.7 0.4]
 [6.5 2.8 4.6 1.5]
 [5.  2.3 3.3 1. ]
 [5.7 3.  4.2 1.2]
 [6.3 3.3 6.  2.5]
 [6.9 3.2 5.7 2.3]
 [4.8 3.4 1.9 0.2]
 [5.5 2.4 3.7 1. ]
 [4.6 3.2 1.4 0.2]
 [6.3 2.3 4.4 1.3]
 [6.3 2.5 5.  1.9]
 [4.9 2.5 4.5 1.7]
 [7.9 3.8 6.4 2. ]
 [4.9 3.1 1.5 0.2]
 [5.7 2.8 4.1 1.3]
 [7.4 2.8 6.1 1.9]
 [6.2 3.4 5.4 2.3]
 [5.5 4.2 1.4 0.2]
 [6.1 2.6 5.6 1.4]
 [5.4 3.  4.5 1.5]
 [7.  3.2 4.7 1.4]
 [7.7 3.8 6.7 2.2]
 [5.9 3.  4.2 1.5]
 [5.  3.6 1.4 0.2]
 [6.5 3.2 5.1 2. ]
 [6.7 3.  5.  1.7]
 [4.7 3.2 1.6 0.2]
 [5.8 2.6 4.  1.2]
 [5.1 3.3 1.7 0.5]
 [6.4 2.8 5.6 2.1]
 [5.5 2.3 4.  1.3]
 [6.8 2.8 4.8 1.4]
 [6.4 2.8 5.6 2.2]
 [5.8 2.8 5.1 2.4]
 [6.3 2.5 4.9 1.5]
 [4.9 3.6 1.4 0.1]
 [5.  3.4 1.6 0.4]
 [6.3 3.4 5.6 2.4]
 [4.9 3.  1.4 0.2]
 [4.8 3.4 1.6 0.2]
 [6.8 3.  5.5 2.1]
 [5.8 2.7 5.1 1.9]
 [5.5 2.5 4.  1.3]
 [4.4 2.9 1.4 0.2]
 [5.6 3.  4.1 1.3]
 [6.4 2.7 5.3 1.9]
 [6.2 2.2 4.5 1.5]
 [6.5 3.  5.8 2.2]
 [7.6 3.  6.6 2.1]
 [6.2 2.9 4.3 1.3]
 [4.4 3.2 1.3 0.2]
 [6.1 2.8 4.  1.3]
 [5.6 2.8 4.9 2. ]
 [6.1 3.  4.9 1.8]
 [6.  2.2 4.  1. ]
 [5.2 3.5 1.5 0.2]
 [5.7 2.8 4.5 1.3]
 [6.  3.4 4.5 1.6]
 [5.8 2.7 3.9 1.2]
 [6.  2.2 5.  1.5]
 [5.9 3.2 4.8 1.8]
 [5.5 2.4 3.8 1.1]
 [5.8 2.7 5.1 1.9]
 [7.3 2.9 6.3 1.8]
 [7.2 3.6 6.1 2.5]
 [5.8 4.  1.2 0.2]
 [6.7 3.3 5.7 2.1]
 [5.1 2.5 3.  1.1]
 [5.2 4.1 1.5 0.1]
 [6.8 3.2 5.9 2.3]
 [6.  3.  4.8 1.8]
 [5.1 3.5 1.4 0.2]
 [6.  2.9 4.5 1.5]
 [5.6 2.7 4.2 1.3]
 [6.5 3.  5.2 2. ]
 [4.4 3.  1.3 0.2]
 [4.6 3.6 1.  0.2]
 [5.  2.  3.5 1. ]
 [4.3 3.  1.1 0.1]
 [6.3 3.3 4.7 1.6]
 [5.7 2.9 4.2 1.3]
 [5.  3.2 1.2 0.2]
 [6.7 2.5 5.8 1.8]
 [6.4 2.9 4.3 1.3]
 [5.6 3.  4.5 1.5]
 [5.  3.  1.6 0.2]
 [7.7 2.6 6.9 2.3]
 [6.6 2.9 4.6 1.3]
 [5.9 3.  5.1 1.8]
 [6.3 2.9 5.6 1.8]
 [6.7 3.1 4.7 1.5]
 [5.7 4.4 1.5 0.4]
 [5.  3.5 1.6 0.6]
 [6.5 3.  5.5 1.8]
 [7.2 3.  5.8 1.6]
 [6.7 3.1 4.4 1.4]
 [5.5 3.5 1.3 0.2]
 [6.7 3.  5.2 2.3]
 [4.9 2.4 3.3 1. ]
 [6.7 3.3 5.7 2.5]
 [5.7 2.6 3.5 1. ]
 [4.5 2.3 1.3 0.3]
 [5.3 3.7 1.5 0.2]
 [5.1 3.7 1.5 0.4]
 [6.9 3.1 5.1 2.3]
 [5.  3.3 1.4 0.2]
 [4.8 3.  1.4 0.1]
 [6.3 2.7 4.9 1.8]
 [4.6 3.4 1.4 0.3]
 [5.5 2.6 4.4 1.2]
 [5.1 3.4 1.5 0.2]
 [6.1 3.  4.6 1.4]
 [5.4 3.4 1.5 0.4]
 [5.  3.5 1.3 0.3]
 [6.  2.7 5.1 1.6]], 个数: 120
训练集的标签: [0 1 0 2 0 0 1 1 1 2 2 0 1 0 1 2 2 2 0 1 2 2 0 2 1 1 2 1 0 2 1 0 1 0 2 1 1
 2 2 1 0 0 2 0 0 2 2 1 0 1 2 1 2 2 1 0 1 2 2 1 0 1 1 1 2 1 1 2 2 2 0 2 1 0
 2 2 0 1 1 2 0 0 1 0 1 1 0 2 1 1 0 2 1 2 2 1 0 0 2 2 1 0 2 1 2 1 0 0 0 2 0
 0 2 0 1 0 1 0 0 1], 个数: 120
测试集的特征: [[6.9 3.1 5.4 2.1]
 [7.2 3.2 6.  1.8]
 [5.8 2.7 4.1 1. ]
 [4.6 3.1 1.5 0.2]
 [5.7 2.5 5.  2. ]
 [6.9 3.1 4.9 1.5]
 [5.7 3.8 1.7 0.3]
 [6.4 3.1 5.5 1.8]
 [5.4 3.4 1.7 0.2]
 [5.6 2.9 3.6 1.3]
 [6.1 2.8 4.7 1.2]
 [4.8 3.1 1.6 0.2]
 [7.1 3.  5.9 2.1]
 [5.1 3.8 1.5 0.3]
 [5.4 3.7 1.5 0.2]
 [6.3 2.8 5.1 1.5]
 [6.4 3.2 4.5 1.5]
 [6.1 2.9 4.7 1.4]
 [7.7 3.  6.1 2.3]
 [5.2 3.4 1.4 0.2]
 [6.4 3.2 5.3 2.3]
 [4.8 3.  1.4 0.3]
 [5.1 3.8 1.6 0.2]
 [4.7 3.2 1.3 0.2]
 [6.7 3.1 5.6 2.4]
 [5.1 3.5 1.4 0.3]
 [5.1 3.8 1.9 0.4]
 [6.2 2.8 4.8 1.8]
 [6.6 3.  4.4 1.4]
 [5.6 2.5 3.9 1.1]], 个数: 30
测试集的标签: [2 2 1 0 2 1 0 2 0 1 1 0 2 0 0 2 1 1 2 0 2 0 0 0 2 0 0 2 1 1], 个数: 30

dm04_iris_evaluate_test()输出:

相关推荐
人生百态,人生如梦8 小时前
情感交互仿生人从技术到落地构想3——技术交流贴(2026.7)
人工智能·机器学习·人机交互·交互·具身智能
用户652238438118 小时前
为什么成熟的 LLM 应用,都把"后端地址"做成可切换的配置
人工智能
Aa99883348 小时前
AI视觉检测设备厂家的技术评估框架——以及AI视觉检测的检出边界与适用条件
人工智能
wuhanzhanhui8 小时前
当AI遇见储能!2026武汉国际数字能源产业与新型电力及储能技术展览会
人工智能·能源
香辣牛肉饭8 小时前
【算法】动态规划 最长公共子序列(LCS)
经验分享·笔记·算法·动态规划
赶紧写完去睡觉8 小时前
Anaconda 创建虚拟环境与使用
python·pycharm·conda
迷途呀8 小时前
Python:函数中的参数类型
开发语言·笔记·python·langchain·nlp
Tangyuewei8 小时前
给 AI 套上缰绳:Harness Engineering 是什么
人工智能
AI棒棒牛8 小时前
第11讲 | 目标检测任务:边界框、IoU、类别与置信度
人工智能·yolo·目标检测·yolo26
allione8 小时前
AI时代测试方向AI for Testing和Testing for AI
人工智能·ai测试