基于身高、体重和鞋码的性别预测:KNN算法实现
基于身高、体重和鞋码的性别预测:KNN算法实现
本文将利用KNN(K近邻算法)根据身高、体重、鞋子尺码等特征数据,预测未知样本的性别。
数据集
我们拥有以下数据集,前三列分别代表身高、体重、鞋子尺码,最后一列为对应的性别标签。
[170,65,41,'男']
[166,55,38,'女']
[177,80,39,'女']
[179,80,43,'男']
[170,60,40,'女']
[170,60,38,'女']
目标
现有一个特征数据 [176,71,38,'?'],我们需要利用KNN算法预测该样本的性别。
KNN示意图
KNN流程图
代码实现
import numpy as np
import operator
# 创建数据集
def createDataSet():
group = np.array([[170,65,41],[166,55,38],[177,80,39],[179,80,43],[170,60,40],[170,60,38]])
labels = ['男','女','女','男','女','女']
return group, labels
# KNN分类器
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
# 计算距离
diffMat = np.tile(inX, (dataSetSize,1)) - dataSet
sqDiffMat = diffMat ** 2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances ** 0.5
# 选择距离最小的k个点
sortedDistIndicies = distances.argsort()
classCount={}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
# 排序
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]
# 测试数据
def classify():
group, labels = createDataSet()
test = np.array([176,71,38])
k = 3
# KNN分类
test_class = classify0(test, group, labels, k)
print('测试数据:',test)
print('分类结果:',test_class)
classify()
实验过程
- 首先定义
createDataSet函数,用于创建数据集。 - 定义
classify0函数,实现KNN分类器。该函数使用欧式距离计算样本间的距离,并选择距离最近的k个样本。最后根据这k个样本的类别,进行投票,返回出现次数最多的类别作为预测结果。 - 定义
classify函数,用于测试数据。该函数调用createDataSet函数创建数据集,并定义测试数据test。然后调用classify0函数进行分类,并输出测试数据和预测结果。 - 运行
classify函数,输出结果。
实验结果分析
根据给出的数据集,将测试数据 [176,71,38] 分别与数据集中的每个数据计算距离,然后选择距离最小的k个点。当k=3时,最近的3个点分别为 [177,80,39],[170,65,41],[170,60,40]。其中,[177,80,39] 和 [170,60,40] 属于女性,[170,65,41] 属于男性。
因此,根据KNN分类器,测试数据 [176,71,38] 所属的类别为 女性。
总结心得体会
KNN算法是一种简单易懂的分类算法,它的核心思想是找到离待分类样本最近的k个样本,然后根据这k个样本的类别来判断待分类样本的类别。在实际应用中,k值的选择对分类结果有很大的影响。当k值较小时,分类器的预测误差会较小,但对异常值比较敏感;当k值较大时,分类器的预测误差会较大,但对异常值比较不敏感。因此,在实际应用中,需要根据具体情况选择合适的k值。
注意:
- 本文提供的代码和数据集仅供参考,实际应用中需要根据具体情况调整参数和数据集。
- KNN算法是一种简单易懂的算法,但它存在一些局限性,例如对高维数据和异常值比较敏感。在实际应用中,需要根据具体情况选择合适的算法。
- 本文提供的代码仅供参考,读者可以根据自己的需要进行修改和完善。
原文地址: https://www.cveoy.top/t/topic/omVY 著作权归作者所有。请勿转载和采集!