机器学习算法之k-近邻算法(python实现)

        K-近邻算法(K-Nearest Neighbors,KNN)是一种基本的分类和回归方法,它的基本思想是基于已有的样本数据集,对新的未知样本进行预测。对于一个未知的数据样本,k-近邻算法会在已有的样本数据集中找到与样本距离最近的k个数据点,然后选择这k个数据点中出现次数最多的标签作为最后的预测结果。

        本次算法的数据集我用的是鸢尾花数据集,共有150条数据。

        

 

        具体python代码如下:

from numpy import *
import math

# "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"

temp = []

with open("./iris.txt", "r") as f:
    for line in f.readlines():
        line = line.strip('\n').split(' ')  # 去掉列表中每一个元素的换行符
        line.pop(0)  # 去掉每行数据的"id"数据
        temp.append(line)

iris = array(temp)  # 最后用iris二维数组来存储数据集中的数据

testData = []  # 定义一个testData列表来接收用户输入的数据
sepalLength = float(input('请输入花萼长度:'))
sepalWidth = float(input('请输入花萼宽度:'))
petalLength = float(input('请输入花瓣长度:'))
petalWidth = float(input('请输入花瓣宽度:'))

testData.append(sepalLength)
testData.append(sepalWidth)
testData.append(petalLength)
testData.append(petalWidth)

distance = []

for item in iris:
    # 计算数据集中每一个鸢尾花数据和与用户输入的数据之间的距离
    result = math.sqrt((testData[0] - float(item[0]))**2 + (testData[1] - float(item[1]))**2
                       + (testData[2] - float(item[2]))**2 + (testData[3] - float(item[3]))**2)
    distance.append({
        'data': result,
        'species': item[4]
    })  # 用一个字典来存储每一个鸢尾花与用户输入的数据之间的距离和每个鸢尾花的种类,
    # 并将字典结果存储到distance列表中

for i in range(1, len(distance)):  # 用冒泡排序算法根据每个鸢尾花数据与用户输入的数据之间的距离对distance中的数据进行升序排序
    for j in range(0, len(distance) - i):
        if distance[j]['data'] > distance[j + 1]['data']:
            temp = distance[j]
            distance[j] = distance[j + 1]
            distance[j + 1] = temp

k = 15  # 定义k-近邻算法中的k值为15

species = ["setosa", "versicolor", "virginica"]  # 鸢尾花的按三个种类
count = [0, 0, 0]  # 用count列表存储距离最小的前k个数据中每个鸢尾花种类的数量

for i in range(0, k):  # 统计前k个数据中每个鸢尾花种类的数量并存储到count列表中
    if str(distance[i]['species']).replace('"', '') == 'setosa':
        count[0] += 1
    elif str(distance[i]['species']).replace('"', '') == 'versicolor':
        count[1] += 1
    else:
        count[2] += 1

max = 0

for i in range(1, 3):  # 找出前k个数据中数量最多的那个鸢尾花的分类,即为最终的分类结果
    if count[i] > max:
        max = i

print('预测您的鸢尾花种类为:'+species[max])

        代码运行结果如下:

       

 

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值