"); //-->
KNN是一种惰性、基于实例的算法。它的工作原理是将新样本的特征与数据集中现有样本的特征进行比较。然后算法选择最接近的k个样本,其中k是用户定义的参数。新样本的输出是基于“k”最近样本的多数类(用于分类)或平均值(用于回归)确定的。
有很多距离度量的算法,我们这里选取3个最常用度量的算法来进行演示:
1. 欧氏距离 Euclidean Distance
def euclidean_distance(x1, x2): return math.sqrt(np.sum((x1 - x2)**2))
euclidean_distance函数计算多维空间中两点(x1和x2)之间的欧氏距离,函数的工作原理如下:
欧几里得距离是欧几里得空间中两点之间的直线距离。通过计算欧几里得距离,可以识别给定样本的最近邻居,并根据邻居的多数类(用于分类)或平均值(用于回归)进行预测。在处理连续的实值特征时,使用欧几里得距离很有帮助,因为它提供了一种直观的相似性度量。
2. 曼哈顿距离 Manhattan Distance
两点坐标的绝对差值之和。
def manhattan_distance(x1, x2): return np.sum(np.abs(x1 - x2))
Manhattan _distance函数计算多维空间中两点(x1和x2)之间的曼哈顿距离,函数的工作原理如下:
曼哈顿距离,也称为L1距离或出租车距离,是两点坐标的绝对差值之和。它代表了当运动被限制为网格状结构时,点之间的最短路径,类似于在城市街道上行驶的出租车。
在数据特征具有不同尺度的情况下,或者当问题域的网格状结构使其成为更合适的相似性度量时,使用曼哈顿距离可能会有所帮助。曼哈顿距离可以根据样本的特征来衡量样本之间的相似性或差异性。
与欧几里得距离相比,曼哈顿距离对异常值的敏感性较低,因为它没有对差异进行平方。这可以使它更适合于某些数据集或异常值的存在可能对模型的性能产生重大影响的问题。
3. 闵可夫斯基距离 Minkowski Distance
它是欧几里得距离和曼哈顿距离的一般化的表现形式,使用p进行参数化。当p=2时,它变成欧氏距离,当p=1时,它变成曼哈顿距离。
def minkowski_distance(x1, x2, p): return np.power(np.sum(np.power(np.abs(x1 - x2), p)), 1/p)
minkowski_distance函数计算多维空间中两点(x1和x2)之间的闵可夫斯基距离。
当你想要控制单个特征的差异对整体距离的影响时,使用闵可夫斯基距离会很有帮助。通过改变p值,可以调整距离度量对特征值或大或小差异的灵敏度,使其更适合特定的问题域或数据集。
闵可夫斯基距离可以根据样本的特征来衡量样本之间的相似性或不相似性。该算法通过计算适当p值的闵可夫斯基距离,识别出给定样本的最近邻居,并根据邻居的多数类(用于分类)或平均值(用于回归)进行预测。
因为KNN算法的原理很简单,所以我们这里直接使用Python实现,这样也可以对算法有一个更好的理解:
def knn_euclidean_distance(X_train, y_train, X_test, k): # List to store the predicted labels for the test set y_pred = []
# Iterate over each point in the test set for i in range(len(X_test)): distances = [] # Iterate over each point in the training set for j in range(len(X_train)): # Calculate the distance between the two points using the Euclidean distance metric dist = euclidean_distance(X_test[i], X_train[j]) distances.append((dist, y_train[j]))
# Sort the distances list by distance (ascending order) distances.sort()
# Get the k nearest neighbors neighbors = distances[:k]
# Count the votes for each class counts = {} for neighbor in neighbors: label = neighbor[1] if label in counts: counts[label] += 1 else: counts[label] = 1
# Get the class with the most votes max_count = max(counts, key=counts.get) y_pred.append(max_count)
return y_pred
def knn_minkowski_distance(X_train, y_train, X_test, k, p): # List to store the predicted labels for the test set y_pred = []
# Iterate over each point in the test set for i in range(len(X_test)): distances = [] # Iterate over each point in the training set for j in range(len(X_train)): # Calculate the distance between the two points using the Minkowski distance metric dist = minkowski_distance(X_test[i], X_train[j], p) distances.append((dist, y_train[j]))
# Sort the distances list by distance (ascending order) distances.sort()
# Get the k nearest neighbors neighbors = distances[:k]
# Count the votes for each class counts = {} for neighbor in neighbors: label = neighbor[1] if label in counts: counts[label] += 1 else: counts[label] = 1
# Get the class with the most votes max_count = max(counts, key=counts.get) y_pred.append(max_count)
return y_pred
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
海联达(Aigale)Ai-HD1 无线全高清套件拆解
AI热潮引发多层陶瓷电容MLCC供应短缺
紧凑型集成连接器模块抑制噪声 为人工智能应用实现以太网供电
尼吉康的事业介绍
研华 COMPUTEX 首度整合全球伙伴大会 强化全球边缘 AI 生态系统联结
PowiGaN for AI Data Centers: Unmatched Power Density and Reliability
基于Ai-WB2-12F与Rd-04的雷达检测系统
英伟达CFO:我们早就知道内存大涨价要来了
基于Microchip MCU的AI/ML培训教程2
EEPW2018年6月刊(5G)
Nigel AI赋能LabVIEW,NI用AI重塑测试新边界
基于Microchip MCU的AI/ML培训教程1
赋能边缘端对话式人工智能
爱立信携手 Net Feasa 布局海事网络 融合公网级通信与智能体 AI 赋能航运
人工智能是如何帮助阻止造假者的?
GPU:面临工作负载转变的高吞吐架构
释说芯语16:硬科技:构建企业未来之路(附PPT)
EEPW2018年3月刊(工业物联网)
基于VisitionX制造智能眼镜
基于Microchip MCU的AI/ML培训教程3
瑞萨电子AI单元解决方案成功提高GE医疗(日本)日野工厂的生产力
AI竞争进入下半场:从“卷参数”到“卷单价”
万家乐JSYZ5-AI燃气热水器电路图
AI 驱动估值飙升:光通信半导体企业市值暴涨
WTC-AI太阳能热水器电路图
iCAN-4017 AI功能模块
WTC-AI型太阳能热水器电路图
电子元件培训教材
CSR8670CSR8675智能语音Alexa蓝牙方案开发
继上次海联达Ai-ap100拆机之电源改造