[机器学习]04-基于K近邻(KNN)的鸢尾花数据集分类

该方法使用了k近邻(KNN)密度估计计算概率密度

  • :近邻数

  • :总样本数

  • :以x为中心、到第k个近邻的距离 dk(x)dk​(x) 为半径的超球体体积

程序代码:

python 复制代码
import math
import random
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.ticker import MultipleLocator

data_dict = {}
train_data = {}
test_data = {}

with open('Iris数据txt版.txt', 'r') as file:
    for line in file:
        line = line.strip()
        data = line.split('\t')
        if len(data) >= 3:
            try:
                category = data[0]
                attribute1 = eval(data[1])
                attribute2 = eval(data[2])

                if category not in data_dict:
                    data_dict[category] = {'Length': [], 'Width': []}

                data_dict[category]['Length'].append(attribute1)
                data_dict[category]['Width'].append(attribute2)
            except ValueError:
                print(f"Invalid data in line: {line}")
                continue
for category, attributes in data_dict.items():
    print(f'种类: {category}')
    print(len(attributes["Length"]))
    print(len(attributes["Width"]))
    print(f'属性1: {attributes["Length"]}')
    print(f'属性2: {attributes["Width"]}')

for category, attributes in data_dict.items():
    lengths = attributes['Length']
    widths = attributes['Width']
    train_indices = random.sample(range(len(lengths)), 45)
    test_indices = [i for i in range(len(lengths)) if i not in train_indices]

    train_data[category] = {
        'Length': [lengths[i] for i in train_indices],
        'Width': [widths[i] for i in train_indices]
    }

    test_data[category] = {
        'Length': [lengths[i] for i in test_indices],
        'Width': [widths[i] for i in test_indices]
    }

prior_rate = 1.0/len(data_dict)

print(len(train_data['1']['Length']))
print(train_data['1'])
print(len(test_data['1']['Length']))
print(test_data['1'])
print(len(train_data['2']['Length']))
print(train_data['2'])
print(len(test_data['2']['Length']))
print(test_data['2'])
print(len(train_data['3']['Length']))
print(train_data['3'])
print(len(test_data['3']['Length']))
print(test_data['3'])

'''
用传统方法k近邻计算概率密度
'''
kn = 7   #Kn = sqrt(n)
n = 45

length_range = np.around(np.linspace(4, 8, 40), 1)
width_range = np.around(np.linspace(2, 4.5, 25), 1)
length_mesh, width_mesh = np.meshgrid(length_range, width_range)

distances_dict = {}
for length in length_range:
    for width in width_range:
        distances = []
        for category1, attributes1 in train_data.items():
            lengths = attributes1['Length']
            widths = attributes1['Width']
            distances_to_points = np.sqrt((np.array(lengths) - length) ** 2 + (np.array(widths) - width) ** 2)
            n_shortest_distance = np.partition(sorted(distances_to_points,reverse=True), kn-1)[kn-1]
            distances.append(kn/(n*math.pi*math.pow(n_shortest_distance,2)))
        distances_dict[(length, width)] = distances

for key, value in distances_dict.items():
    print(f'坐标点: {key}, 概率密度: {value}')

right = 0
all = 0

for category2,data2 in test_data.items():
    print(category2,data2)
    for i,j in zip(data2['Length'],data2['Width']):
        print(i,j)
        for key, value in distances_dict.items():
            if key[0] == i and key[1] == j:
                print(value)
                predict = value.index(max(value))+1
                print(category2,predict)
                all += 1
                if int(category2) == predict:
                    right += 1

print("正确率:",right/all)

运行结果:

种类: 1

50

50

属性1: 5.1, 4.9, 4.7, 4.6, 5.0, 5.4, 4.6, 5.0, 4.4, 4.9, 5.4, 4.8, 4.8, 4.3, 5.8, 5.7, 5.4, 5.1, 5.7, 5.1, 5.4, 5.1, 4.6, 5.1, 4.8, 5.0, 5.0, 5.2, 5.2, 4.7, 4.8, 5.4, 5.2, 5.5, 4.9, 5.0, 5.5, 4.9, 4.4, 5.1, 5.0, 4.5, 4.4, 5.0, 5.1, 4.8, 5.1, 4.6, 5.3, 5.0

属性2: 3.5, 3.0, 3.2, 3.1, 3.6, 3.9, 3.4, 3.4, 2.9, 3.1, 3.7, 3.4, 3.0, 3.0, 4.0, 4.4, 3.9, 3.5, 3.8, 3.8, 3.4, 3.7, 3.6, 3.3, 3.4, 3.0, 3.4, 3.5, 3.4, 3.2, 3.1, 3.4, 4.1, 4.2, 3.1, 3.2, 3.5, 3.6, 3.0, 3.4, 3.5, 2.3, 3.2, 3.5, 3.8, 3.0, 3.8, 3.2, 3.7, 3.3

种类: 2

50

50

属性1: 7.0, 6.4, 6.9, 5.5, 6.5, 5.7, 6.3, 4.9, 6.6, 5.2, 5.0, 5.9, 6.0, 6.1, 5.6, 6.7, 5.6, 5.8, 6.2, 5.6, 5.9, 6.1, 6.3, 6.1, 6.4, 6.6, 6.8, 6.7, 6.0, 5.7, 5.5, 5.5, 5.8, 6.0, 5.4, 6.0, 6.7, 6.3, 5.6, 5.5, 5.5, 6.1, 5.8, 5.0, 5.6, 5.7, 5.7, 6.2, 5.1, 5.7

属性2: 3.2, 3.2, 3.1, 2.3, 2.8, 2.8, 3.3, 2.4, 2.9, 2.7, 2.0, 3.0, 2.2, 2.9, 2.9, 3.1, 3.0, 2.7, 2.2, 2.5, 3.2, 2.8, 2.5, 2.8, 2.9, 3.0, 2.8, 3.0, 2.9, 2.6, 2.4, 2.4, 2.7, 2.7, 3.0, 3.4, 3.1, 2.3, 3, 2.5, 2.6, 3.0, 2.6, 2.3, 2.7, 3.0, 2.9, 2.9, 2.5, 2.8

种类: 3

50

50

属性1: 6.3, 5.8, 7.1, 6.3, 6.5, 7.6, 4.9, 7.3, 6.7, 7.2, 6.5, 6.4, 6.8, 5.7, 5.8, 6.4, 6.5, 7.7, 7.7, 6.0, 6.9, 5.6, 7.7, 6.3, 6.7, 7.2, 6.2, 6.1, 6.4, 7.2, 7.4, 7.9, 6.4, 6.3, 6.1, 7.7, 6.3, 6.4, 6.0, 6.9, 6.7, 6.9, 5.8, 6.8, 6.7, 6.7, 6.3, 6.5, 6.2, 5.9

属性2: 3.3, 2.7, 3.0, 2.9, 3.0, 3.0, 2.5, 2.9, 2.5, 3.6, 3.2, 2.7, 3.0, 2.5, 2.8, 3.2, 3.0, 3.8, 2.6, 2.2, 3.2, 2.8, 2.8, 2.7, 3.3, 3.2, 2.8, 3.0, 2.8, 3.0, 2.8, 3.8, 2.8, 2.8, 2.6, 3.0, 3.4, 3.1, 3.0, 3.1, 3.1, 3.1, 2.7, 3.2, 3.3, 3, 2.5, 3, 3.4, 3

1 {'Length': 4.6, 5.8, 5.1, 5.5, 5.0, 'Width': 3.4, 4.0, 3.8, 3.5, 3.3}

4.6 3.4

0.6189358898018181, 0.03614224174025197, 0.020545589702964818

1 1

5.8 4.0

0.14563197407101539, 0.04542648732490388, 0.04542648732490388

1 1

5.1 3.8

0.5501652353793919, 0.04058595998700429, 0.0301919946244788

1 1

5.5 3.5

0.38088362449342483, 0.12076797849791507, 0.07617672489868499

1 1

5.0 3.3

2 {'Length': 6.0, 5.6, 5.5, 5.7, 5.7, 'Width': 2.2, 3.0, 2.6, 3.0, 2.8}

6.0 2.2

5.6 3.0

0.12076797849791528, 0.5501652353793887, 0.12378717796036282

2 2

5.5 2.6

0.076176724898685, 0.6189358898018155, 0.1207679784979152

2 2

5.7 3.0

0.09522090612335607, 0.5501652353793919, 0.17074093511774208

2 2

5.7 2.8

0.0728159870355077, 1.2378717796036336, 0.24757435592072652

2 2

3 {'Length': 5.8, 6.4, 6.9, 5.8, 6.5, 'Width': 2.7, 3.1, 3.1, 2.7, 3}

5.8 2.7

0.05501652353793919, 1.2378717796036283, 0.2912639481420303

3 2

6.4 3.1

0.030946794490090756, 0.5501652353793919, 0.5501652353793919

3 2

6.9 3.1

0.016957147665803148, 0.4951487118414499, 0.9902974236829026

3 3

5.8 2.7

0.05501652353793919, 1.2378717796036283, 0.2912639481420303

3 2

6.5 3

0.02552312947636352, 0.9902974236829026, 0.9902974236829043

3 3

正确率: 0.7692307692307693

相关推荐
一次旅行2 分钟前
2026‑09‑04 AI产业深度解读|英伟达129亿收Hugging Face、GPT-6 Astra刷榜、智能体安全走向产品化
人工智能·安全·开源
段一凡-华北理工大学3 分钟前
高炉智能布料技术与炉料分布优化~系列文章03:布料矩阵解码:环位、角度、圈数与料流的量化控制
java·网络·人工智能·矩阵·高炉智能化·高炉布料矩阵优化·高炉智能布料技术
adinnet20265 分钟前
工厂生产决策辅助:辅助分析各工序成本与效率数据
人工智能·自动化
m4Rk_6 分钟前
【论文阅读】Agent 记忆机制(60):MemInsight——让 LLM 自动为历史记忆生成语义索引
论文阅读·人工智能·学习·开源·github
jimmyleeee9 分钟前
大模型安全之四:供应链安全
人工智能·安全
微三云 - 廖会灵 (私域系统开发)1 小时前
存量社区破局:当物业困局遇上消费返物业费,重构社区商业新生态
大数据·人工智能·重构
T型码农要学习3 小时前
开源项目5|FileBrowser:免费在线文件管理器!随时随地管控服务器文件
运维·服务器·人工智能·开源
智恒百亿3 小时前
8 卡 RTX 5090 服务器深度实测:256GB 显存能否支撑 70B 模型微调?选型参考
大数据·运维·服务器·人工智能
ai小陈5 小时前
PyTorch DataLoader数据加载性能排查:GPU利用率低的实操指南
人工智能·pytorch·python·深度学习·ai·gpu算力
测试者家园7 小时前
为什么意图驱动测试是自动化测试的下一站,而不是替代品
自动化测试·软件测试·人工智能·持续测试·ai赋能·智能化测试·软件测试变革