K-最近邻算法

K-最近邻(KNN)是一种简单的分类算法,通过计算测试数据与训练集中每个数据的欧几里得距离,选择最近的K个邻居并根据它们的类别决定测试数据的分类。在实际应用中,需要注意训练集的公平性,算法优化以及大规模数据时的计算复杂度问题。在编码实现过程中,排序细节如数据类型的选择是常见难点。

介绍

KNN算法全名为k-Nearest Neighbor,就是K最近邻的意思。KNN也是一种分类算法。但是与之前说的决策树分类算法相比,这个算法算是最简单的一个了。算法的主要过程为:

1、给定一个训练集数据,每个训练集数据都是已经分好类的。
2、设定一个初始的测试数据a,计算a到训练集所有数据的欧几里得距离,并排序。                       

3、选出训练集中离a距离最近的K个训练集数据。

4、比较k个训练集数据,选出里面出现最多的分类类型,此分类类型即为最终测试数据a的分类。

下面百度百科上的一张简图:


KNN算法实现

首先测试数据需要2块,1个是训练集数据,就是已经分好类的数据,比如上图中的非绿色的点。还有一个是测试数据,就是上面的绿点,当然这里的测试数据不会是一个,而是一组。这里的数据与数据之间的距离用数据的特征向量做计算,特征向量可以是多维度的。通过计算特征向量与特征向量之间的欧几里得距离来推算相似度。定义训练集数据trainInput.txt:

a 1 2 3 4 5 
b 5 4 3 2 1 
c 3 3 3 3 3 
d -3 -3 -3 -3 -3 
a 1 2 3 4 4 
b 4 4 3 2 1 
c 3 3 3 2 4 
d 0 0 1 1 -2 
待测试数据testInput,只有特征向量值:

1 2 3 2 4 
2 3 4 2 1 
8 7 2 3 5 
-3 -2 2 4 0 
-4 -4 -4 -4 -4 
1 2 3 4 4 
4 4 3 2 1 
3 3 3 2 4 
0 0 1 1 -2 
下面是主程序:

package DataMing_KNN;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.
旅行商问题(TSP)旨在给定一组城市及它们之间的距离,找到一条最短回路,使每个城市恰好被经过一次,在电路板制造、航线规划等领域有广泛应用[^1]。最近邻算法是解决TSP问题的一种贪心策略,具体方法如下: 1. **问题背景与策略**:TSP问题要求从某个城市出发,访问每个城市恰好一次后回到起点,使整个巡回路径的总距离最小。最近邻策略是当旅行商准备前往下一个城市时,在尚未访问的城市中,选择距离当前城市最近的一个作为下一目标,依此类推,直到所有城市都被访问一次,最后回到起点[^2]。 2. **核心步骤**:从任意一个城市开始,每次选择距离当前城市最近的未访问城市作为下一个访问城市,重复该步骤直到所有城市都被访问,最后返回起始城市完成回路[^3]。 下面给出一个简单的Python代码示例来演示最近邻算法求解TSP问题: ```python import math def distance(city1, city2): # 计算两个城市之间的欧几里得距离 return math.sqrt((city1[0] - city2[0])**2 + (city1[1] - city2[1])**2) def nearest_neighbor(cities): num_cities = len(cities) unvisited = set(range(1, num_cities)) current_city = 0 tour = [current_city] while unvisited: nearest = min(unvisited, key=lambda city: distance(cities[current_city], cities[city])) tour.append(nearest) unvisited.remove(nearest) current_city = nearest # 返回起始城市完成回路 tour.append(0) return tour # 示例城市坐标 cities = [(0, 0), (1, 2), (3, 1), (4, 3)] tour = nearest_neighbor(cities) print("最近邻算法得到的旅行路线:", tour) ``` ### 案例 假设在电路板制造中,需要在电路板上的不同位置钻孔,每个钻孔位置可看作一个城市,钻头从一个钻孔位置移动到另一个钻孔位置的距离就是城市间的距离。使用最近邻算法可以快速规划出一个钻孔顺序,使得钻头移动的总距离尽可能短,提高钻孔效率。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值