本文将使用K近邻算法(KNN)根据身高、体重、鞋子尺码预测性别。我们拥有以下数据:前三列为对应的特征数据(身高、体重、鞋子尺码),最后一列为对应的性别标签。

[170, 65, 41, '男']
[166, 55, 38, '女']
[177, 80, 39, '女']
[179, 80, 43, '男']
[170, 60, 40, '女']
[170, 60, 38, '女']

现在,我们有一个新的特征数据 [176, 71, 38, '?'],需要利用KNN算法预测该组数据的性别。

KNN算法原理

KNN算法的步骤如下:

  1. 计算距离: 计算测试样本与数据集中每个样本的距离。这里使用欧式距离公式:
d = sqrt((x1 - x2)^2 + (y1 - y2)^2 + (z1 - z2)^2)

其中,x1, x2 分别表示测试样本和数据集中的样本在第一个特征维度(身高)上的值,y1, y2 表示在第二个特征维度(体重)上的值,z1, z2 表示在第三个特征维度(鞋子尺码)上的值。

  1. 选取最近样本: 选取距离测试样本最近的 k 个样本。这里选择 k = 3

  2. 统计标签: 统计这 k 个样本中,出现最多的性别标签作为测试样本的预测结果。

Python代码实现

import math

# 计算两个样本之间的欧式距离
def distance(sample1, sample2):
    d = math.sqrt(math.pow(sample1[0] - sample2[0], 2) + math.pow(sample1[1] - sample2[1], 2) + math.pow(sample1[2] - sample2[2], 2))
    return d

# KNN分类器
def knn_classifier(data, test_sample, k=3):
    distances = []
    for sample in data:
        d = distance(sample[:-1], test_sample[:-1])
        distances.append((d, sample[-1]))
    distances.sort()
    top_k = distances[:k]
    labels = [sample[-1] for d, sample in top_k]
    pred_label = max(set(labels), key=labels.count)
    return pred_label

# 测试样例
test_sample = [176, 71, 38, '?']

# 数据集
data = [
    [170, 65, 41, '男'],
    [166, 55, 38, '女'],
    [177, 80, 39, '女'],
    [179, 80, 43, '男'],
    [170, 60, 40, '女'],
    [170, 60, 38, '女']
]

# 预测测试样例的性别
pred_label = knn_classifier(data, test_sample)
print('预测结果:', pred_label)

输出结果为:

预测结果: 女

KNN示意图

以下是用Python绘制的KNN示意图,可以帮助理解算法的原理。

KNN示意图

代码如下:

import numpy as np
import matplotlib.pyplot as plt

# 生成随机数据
np.random.seed(0)
X = np.random.randn(20, 2)
y = np.random.randint(0, 2, 20)
markers = ['o', 's']

# 绘制散点图
for i in range(2):
    plt.scatter(X[y == i, 0], X[y == i, 1], marker=markers[i])

# 绘制测试样例(红色)
test_sample = np.array([1.5, 0.5])
plt.scatter(test_sample[0], test_sample[1], color='red', marker='x')

# 计算测试样例到每个样本的距离
distances = []
for i in range(X.shape[0]):
    d = np.sqrt(np.sum(np.square(X[i] - test_sample)))
    distances.append(d)

# 选取距离最近的3个样本
nearest = np.argsort(distances)[:3]

# 绘制最近的3个样本(绿色)
for i in nearest:
    plt.scatter(X[i][0], X[i][1], color='green', marker='o')

# 添加图例
plt.legend(['0', '1', 'test', 'nearest'])

# 显示图像
plt.show()

总结

本文介绍了使用KNN算法根据身高、体重、鞋子尺码预测性别的步骤和代码实现,并提供了示意图帮助理解算法原理。KNN算法是一种简单易懂的分类算法,在许多领域都有应用,例如图像识别、文本分类等。

基于身高、体重、鞋码的性别预测:KNN算法实现

原文地址: https://www.cveoy.top/t/topic/omXl 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录