Python底层实现KNN

今天给大家带来的是关于Python机器学习的相关知识,文章围绕着Python底层实现KNN展开,文中有非常详细的解释及代码示例,需要的朋友可以参考下

一、导入数据

借助python自带的pandas库导入数据,很简单。用的数据是下载到本地的红酒集。

代码如下(示例):

import pandas as pd
def read_xlsx(csv_path):
   data = pd.read_csv(csv_path)
   print(data)
   return data

二、归一化

KNN算法中将用到距离,因此归一化是一个重要步骤,可以消除数据的量纲。我用了归一化,消除量纲也可以用标准化,但是作为新手,我觉得归一化比较简单。

其中最大最小值的计算用到了python中的numpy库,pandas导入的数据是DateFrame形式的,np.array()用来将DateFrame形式转化为可以用numpy计算的ndarray形式。

代码如下(示例):

import numpy as np
def MinMaxScaler(data):
   col = data.shape[1]
   for i in range(0, col-1):
       arr = data.iloc[:, i]
       arr = np.array(arr) #将DataFrame形式转化为ndarray形式,方便后续用numpy计算
       min = np.min(arr)
       max = np.max(arr)
       arr = (arr-min)/(max-min)
       data.iloc[:, i] = arr
   return data

三、分训练集和测试集

先将数据值和标签值分别用x和y划分开,设置随机数种子random_state,若不设置,则每次运行的结果会不相同。test_size表示测试集比例。

def train_test_split(data, test_size=0.2, random_state=None):
   col = data.shape[1]
   x = data.iloc[:, 0:col-1]
   y = data.iloc[:, -1]
   x = np.array(x)
   y = np.array(y)
   # 设置随机种子,当随机种子非空时,将锁定随机数
   if random_state:
       np.random.seed(random_state)
       # 将样本集的索引值进行随机打乱
       # permutation随机生成0-len(data)随机序列
   shuffle_indexs = np.random.permutation(len(x))
   # 提取位于样本集中20%的那个索引值
   test_size = int(len(x) * test_size)
   # 将随机打乱的20%的索引值赋值给测试索引
   test_indexs = shuffle_indexs[:test_size]
   # 将随机打乱的80%的索引值赋值给训练索引
   train_indexs = shuffle_indexs[test_size:]
   # 根据索引提取训练集和测试集
   x_train = x[train_indexs]
   y_train = y[train_indexs]
   x_test = x[test_indexs]
   y_test = y[test_indexs]
   # 将切分好的数据集返回出去
   # print(y_train)
   return x_train, x_test, y_train, y_test

四、计算距离

此处用到欧氏距离,pow()函数用来计算幂次方。length指属性值数量,在计算最近邻时用到。

def CountDistance(train,test,length):
   distance = 0
   for x in range(length):
       distance += pow(test[x] - train[x], 2)**0.5
   return distance

五、选择最近邻

计算测试集中的一条数据和训练集中的每一条数据的距离,选择距离最近的k个,以少数服从多数原则得出标签值。其中argsort返回的是数值从小到大的索引值,为了找到对应的标签值。

tip:用numpy计算众数的方法

import numpy as np
#bincount():统计非负整数的个数,不能统计浮点数
counts = np.bincount(nums)
#返回众数
np.argmax(counts)

少数服从多数原则,计算众数,返回标签值。

def getNeighbor(x_train,test,y_train,k):
   distance = []
   #测试集的维度
   length = x_train.shape[1]
   #测试集合所有训练集的距离
   for x in range(x_train.shape[0]):
       dist = CountDistance(test, x_train[x], length)
       distance.append(dist)
   distance = np.array(distance)
   #排序
   distanceSort = distance.argsort()
   # distance.sort(key= operator.itemgetter(1))
   # print(len(distance))
   # print(distanceSort[0])
   neighbors =[]
   for x in range(k):
       labels = y_train[distanceSort[x]]
       neighbors.append(labels)
       # print(labels)
   counts = np.bincount(neighbors)
   label = np.argmax(counts)
   # print(label)
   return label

调用函数时:

getNeighbor(x_train,x_test[0],y_train,3)

六、计算准确率

用以上KNN算法预测测试集中每一条数据的标签值,存入result数组,将预测结果与真实值比较,计算预测正确的个数与总体个数的比值,即为准确率。

def getAccuracy(x_test,x_train,y_train,y_test):
   result = []
   k = 3
   # arr_label = getNeighbor(x_train, x_test[0], y_train, k)
   for x in range(len(x_test)):
       arr_label = getNeighbor(x_train, x_test[x], y_train, k)
       result.append(arr_label)
   correct = 0
   for x in range(len(y_test)):
       if result[x] == y_test[x]:
          correct += 1
   # print(correct)
   accuracy = (correct / float(len(y_test))) * 100.0
   print("Accuracy:", accuracy, "%")
   return accuracy

总结

KNN算是机器学习中最简单的算法,实现起来相对简单,到此这篇关于Python机器学习之底层实现KNN的文章就介绍到这了。

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/219680.html<

(0)
管理的头像管理
上一篇2025-04-14 05:34
下一篇 2025-04-14 05:36

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注