KNN和LMKNN代码差异对比解析[未完成]
创始人
2025-05-29 21:59:21
0

基于之前讲的这篇:机器学习-基于KNN和LMKNN的心脏病预测_牛大了2022的博客-CSDN博客 之后还会尝试其他模型。

由于两者差别在predict函数部分,所以着重解析那里。

1.KNN

import scipy.spatial
from collections import Counterclass KNN:def __init__(self, k):self.k = kdef fit(self, X, y):self.X_train = Xself.y_train = ydef distance(self, X1, X2):return scipy.spatial.distance.euclidean(X1, X2)def predict(self, X_test):final_output = []for i in range(len(X_test)):d = []votes = []for j in range(len(X_train)):dist = scipy.spatial.distance.euclidean(X_train[j] , X_test[i])d.append([dist, j])d.sort()d = d[0:self.k]for d, j in d:votes.append(self.y_train[j])ans = Counter(votes).most_common(1)[0][0]final_output.append(ans)return final_outputdef score(self, X_test, y_test):predictions = self.predict(X_test)value = 0for i in range(len(y_test)):if(predictions[i] == y_test[i]):value += 1return value / len(y_test)

 predict部分解析,最经典的KNN模型:

  1. final_output = [] :创建一个空列表,将最终的预测结果存储在其中。

  2. for i in range(len(X_test)): :对于测试集中的每个样本,执行以下操作:

  3. d = [] :创建一个空列表,存储测试样本到训练样本之间的距离和对应的训练样本的索引。

  4. votes = [] :创建一个空列表,存储与测试样本距离最近的前k个训练样本的类别。

  5. for j in range(len(X_train)): :对于每个训练样本,执行以下操作:

  6. dist = scipy.spatial.distance.euclidean(X_train[j] , X_test[i]) :计算测试样本和训练样本之间的欧氏距离。

  7. d.append([dist, j]) :将距离和训练样本的索引添加到列表d中。

  8. d.sort() :按距离从小到大排序。

  9. d = d[0:self.k] :选择距离最近的前k个训练样本。

  10. for d, j in d: :对于每个距离最近的训练样本,执行以下操作:

  11. votes.append(self.y_train[j]) :将该训练样本的类别添加到列表votes中。

  12. ans = Counter(votes).most_common(1)[0][0] :从votes中找到出现最多的类别,并将其作为预测结果。

  13. final_output.append(ans) :将预测结果添加到列表final_output中。

  14. return final_output :返回最终的预测结果列表。

2.LMKNN

lmknn定义:基于局部均值的k-最近邻(LMKNN)规则作为KNN的扩展,是一种简单而鲁棒的模式分类非参数算法。LMKNN的基本思想是在进行分类决策时,使用训练集中每个类的测试点的k个最近邻居的局部平均向量来确定其类别标签。

import scipy.spatial
import numpy as np
from operator import itemgetterfrom collections import Counter
class LMKNN:def __init__(self, k):self.k = kdef fit(self, X, y):self.X_train = Xself.y_train = ydef distance(self, X1, X2):return scipy.spatial.distance.euclidean(X1, X2)def predict(self, X_test):final_output = []myclass = list(set(self.y_train))for i in range(len(X_test)):eucDist = []votes = []for j in range(len(X_train)):dist = scipy.spatial.distance.euclidean(X_train[j] , X_test[i])eucDist.append([dist, j, self.y_train[j]])eucDist.sort()minimum_dist_per_class = []for c in myclass:minimum_class = []for di in range(len(eucDist)):if(len(minimum_class) != self.k):if(eucDist[di][2] == c):minimum_class.append(eucDist[di])else:breakminimum_dist_per_class.append(minimum_class)indexData = []for a in range(len(minimum_dist_per_class)):temp_index = []for j in range(len(minimum_dist_per_class[a])):temp_index.append(minimum_dist_per_class[a][j][1])indexData.append(temp_index)centroid = []for a in range(len(indexData)):transposeData = X_train[indexData[a]].TtempCentroid = []for j in range(len(transposeData)):tempCentroid.append(np.mean(transposeData[j]))centroid.append(tempCentroid)centroid = np.array(centroid)eucDist_final = []for b in range(len(centroid)):dist = scipy.spatial.distance.euclidean(centroid[b] , X_test[i])eucDist_final.append([dist, myclass[b]])sorted_eucDist_final = sorted(eucDist_final, key=itemgetter(0))final_output.append(sorted_eucDist_final[0][1])return final_outputdef score(self, X_test, y_test):predictions = self.predict(X_test)value = 0for i in range(len(y_test)):if(predictions[i] == y_test[i]):value += 1return value / len(y_test)

predict函数解析:

def predict(self, X_test):
# 初始化空列表,用于保存测试数据的预测结果final_output = []
# 获取训练数据集的类别标签列表myclass = list(set(self.y_train))
# 循环遍历每个测试样本for i in range(len(X_test)):
# 初始化空列表,用于保存每个训练样本到当前测试样本的欧几里得距离eucDist = []
# 初始化空列表,用于保存最近的K个训练样本的类别标签votes = []
# 循环遍历每个训练样本for j in range(len(X_train)):# 计算当前训练样本到当前测试样本的欧几里得距离,并保存到eucDist列表中dist = scipy.spatial.distance.euclidean(X_train[j] , X_test[i])eucDist.append([dist, j, self.y_train[j]])
# 将eucDist列表按照欧几里得距离升序排序eucDist.sort()
# 针对每个类别,选择最近的K个训练样本,并将它们保存到minimum_dist_per_class列表中minimum_dist_per_class = []for c in myclass:minimum_class = []for di in range(len(eucDist)):if(len(minimum_class) != self.k):if(eucDist[di][2] == c):minimum_class.append(eucDist[di])else:breakminimum_dist_per_class.append(minimum_class)
# 将minimum_dist_per_class列表中的每个最近的K个训练样本的下标保存到indexData列表中indexData = []for a in range(len(minimum_dist_per_class)):temp_index = []for j in range(len(minimum_dist_per_class[a])):temp_index.append(minimum_dist_per_class[a][j][1])indexData.append(temp_index)
# 针对每个类别,计算最近的K个训练样本的平均值,并将它们保存到centroid列表中centroid = []for a in range(len(indexData)):transposeData = X_train[indexData[a]].TtempCentroid = []for j in range(len(transposeData)):tempCentroid.append(np.mean(transposeData[j]))centroid.append(tempCentroid)centroid = np.array(centroid)
# 计算测试样本到每个类别的平均值之间的欧几里得距离,并将它们保存到eucDist_final列表中eucDist_final = []for b in range(len(centroid)):dist = scipy.spatial.distance.euclidean(centroid[b] , X_test[i])eucDist_final.append([dist, myclass[b]])
# 将eucDist_final列表按照欧几里得距离升序排序,并将距离最近的类别标签添加到votes列表中sorted_eucDist_final = sorted(eucDist_final, key=itemgetter(0))final_output.append(sorted_eucDist_final[0][1])
#将排序后第一个元素的类别标签存储到final_output列表中return final_output

相关内容

热门资讯

PHP操作文件和目录 PHP操作文件和目录一、目录处理1.1 目录信息查询1.2 目录操作二、文件处理2.1 查询文件信息...
小白开发微信小程序20--we... 1、什么是SwaggerSwagger 项目已于 2015 年捐赠给 OpenAPI 计划ÿ...
台州最新学区划分,最新或202... 台州公办小学招生范围按照义务教育免试就近入学原则,市区公办小学实行依街道划片招生。本文为您介绍台州小...
衢州最新学区划分,最新或202... 柯城区最新或2023(历届)学区划分衢江区最新或2023(历届)学区划分
舟山最新学区划分,最新或202... 临城新区】1、南海实验小学片区:新城沈白线以南、千岛路以西区域,以及长峙社区居民子女。2、舟山第二小...
④电子产品拆解分析-太阳能自动... ④电子产品拆解分析-太阳能自动感应灯一、功能介绍二、电路分析以及器件作用1、太阳能控制电路分析2、优...
丽水最新学区划分,最新或202... 根据“就近入学,统筹安排”为原则,公办小学学区划分也已出炉。  市实验学校:丽阳门居委、高井弄居委。...
海南最新学区划分,最新或202... 1.市直属学校招生范围划分小 学招 生 范 围海口市滨海第九小学滨海大道北侧(至海边),港进路和港集...
从ChatGPT到AGI还有多... 1.引子 21年开始在公司负责一个全链路语音的项目,支持公司的Iot设备,...
海口最新学区划分,最新或202... 海口公办小学招生范围按照义务教育免试就近入学原则,市区公办小学实行依街道划片招生。本文为您介绍海口小...
青海最新学区划分,最新或202... 为方便家长和学生们了解自己孩子所就读的小学或是自己孩子的户口究竟在不在想要入读的中学的学区范围内,小...
西宁最新学区划分,最新或202... 西宁公办小学招生范围按照义务教育免试就近入学原则,市区公办小学实行依街道划片招生。本文为您介绍西宁小...
三亚最新学区划分,最新或202... 三亚公办小学招生范围按照义务教育免试就近入学原则,市区公办小学实行依街道划片招生。本文为您介绍三亚小...
贵州最新学区划分,最新或202... 为方便家长和学生们了解自己孩子所就读的小学或是自己孩子的户口究竟在不在想要入读的中学的学区范围内,小...
21- 神经网络模型_超参数搜... 知识要点 fetch_california_housing:加利福尼亚的房价数据&#...
一文了解GPU并行计算CUDA 了解GPU并行计算CUDA一、CUDA和GPU简介二、GPU工作原理与结构2.1、基础GPU架构2....
贵阳最新学区划分,最新或202... 贵阳公办小学招生范围按照义务教育免试就近入学原则,市区公办小学实行依街道划片招生。本文为您介绍贵阳小...
遵义最新学区划分,最新或202... 遵义公办小学招生范围按照义务教育免试就近入学原则,市区公办小学实行依街道划片招生。本文为您介绍遵义小...
安顺最新学区划分,最新或202... 安顺公办小学招生范围按照义务教育免试就近入学原则,市区公办小学实行依街道划片招生。本文为您介绍安顺小...
六盘水最新学区划分,最新或20... 百年教育网小编为您整理了关于六盘水市幼升小学区划分详情的相关信息,希望对您有帮助,想了解更多请继续关...