摘要:在AI领域,有一类算法如同人类的"直觉判断":通过观察周围人的行为来决定自己的选择。这就是k-近邻算法(kNN),一个靠"看邻居"就能完成分类的神奇模型。今天我们就用最通俗的方式,拆解这个机器学习的基础算法!
在AI领域,有一类算法如同人类的"直觉判断":通过观察周围人的行为来决定自己的选择。这就是k-近邻算法(kNN),一个靠"看邻居"就能完成分类的神奇模型。今天我们就用最通俗的方式,拆解这个机器学习的基础算法!
核心思想:
"一个样本的类别,由它最接近的k个邻居的类别决定"——就像你想知道某个人的性格,看看他身边最要好的3个朋友就知道了。
经典案例:电影类型分类
假设我们有以下电影数据:
电影名称 打斗镜头 接吻镜头 类型 《加州男人》 3 104 爱情片 《动作战士》 101 10 动作片未知电影 18 90 ?
计算未知电影与所有已知电影的"距离"(比如打斗和接吻镜头的差异);选k=3个最近的邻居(如《加州男人》《美丽女人》等);这3个邻居都是爱情片,所以未知电影被判为爱情片。她交往过三类人:"不喜欢""一般魅力""极具魅力",想通过三个特征判断新对象:
每年飞行里程数玩游戏时间占比每周吃冰淇淋升数# 1. 数据解析:从文本文件读取特征和标签def file2matrix(filename):fr = open(filename)data = labels = for line in fr.readlines:line = line.strip.split('\t')data.append(line[:3])labels.append(int(line[-1]))return np.array(data), np.array(labels)# 2. 数据归一化:消除特征量纲影响def autoNorm(dataSet):minVals = dataSet.min(0)maxVals = dataSet.max(0)ranges = maxVals - minValsreturn (dataSet - minVals) / ranges, ranges, minVals# 3. kNN核心算法:计算距离+投票分类def classify0(inX, dataSet, labels, k):distances = np.sqrt(((dataSet - inX)**2).sum(axis=1))nearest = labels[distances.argsort[:k]]return np.bincount(nearest).argmax输入新对象特征:
飞行里程:10000游戏时间:10%冰淇淋:0.5升程序输出:"你可能会喜欢这个人:一般魅力"def img2vector(filename):# 将32x32的图像转成1x1024的向量returnVect = np.zeros((1, 1024))with open(filename) as fr:for i in range(32):line = fr.readlinefor j in range(32):returnVect[0, 32*i+j] = int(line[j])return returnVect# 测试结果:错误率约1.5%(900个测试样本中错13个)
优点:
简单易懂,无需训练过程(直接拿数据比对);精度高,对异常值不敏感;适用于数值型和标称型数据。缺点:
计算量大(每次预测都要对比全量训练数据);空间占用高(存储所有训练数据);高维数据下效果差("维度灾难"问题)。适用场景:
小数据集分类(如几百到几千条数据);文本分类、图像识别的简单场景;作为基线模型(与其他复杂模型对比效果)。数据预处理:归一化/标准化(如autoNorm函数),避免特征量纲影响;降维(如PCA),解决高维数据计算慢的问题。算法优化:用KD树、Ball树加速距离计算,避免暴力搜索;调整leaf_size参数(默认30),平衡建树和查询效率。参数调优:用网格搜索+交叉验证找最佳k值;尝试不同距离度量(如余弦距离替代欧氏距离)。kNN虽然简单,却是机器学习的"启蒙算法"——就像学走路时先迈哪只脚,理解它能帮你打好AI基础。你想用kNN解决什么问题?评论区聊聊吧!
#人工智能 #机器学习 #算法科普
来源:码农世界