网易首页 > 网易号 > 正文 申请入驻

Python底层实现KNN

0
分享至

今天给大家带来的是关于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://www.linuxprobe.com/python-knn-pandas.html

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
直击巴黎热浪下当地华人生活:冰淇淋卖断货 办公室成避暑天堂

直击巴黎热浪下当地华人生活:冰淇淋卖断货 办公室成避暑天堂

大象新闻
2026-06-29 18:18:08
网友用X Money给马斯克转25美元:获本人回应后全网跟风打钱

网友用X Money给马斯克转25美元:获本人回应后全网跟风打钱

快科技
2026-06-29 11:37:24
大摩重磅预测!钠电池要干掉四成磷酸铁锂,盐比锂值钱的时代来了

大摩重磅预测!钠电池要干掉四成磷酸铁锂,盐比锂值钱的时代来了

爱看剧的阿峰
2026-06-30 05:05:02
梅西&姆巴佩之后,加克波成为近两届世界杯都进3+球的第三人

梅西&姆巴佩之后,加克波成为近两届世界杯都进3+球的第三人

懂球帝
2026-06-30 11:00:09
3年4500万美金!1年800万美金!两笔签约达成,马刺要武装到牙齿

3年4500万美金!1年800万美金!两笔签约达成,马刺要武装到牙齿

世界体育圈
2026-06-30 14:42:23
台媒曝75岁郭台铭被50岁中女蓄意勾引!女方离异带娃颜值不及正室

台媒曝75岁郭台铭被50岁中女蓄意勾引!女方离异带娃颜值不及正室

她时尚丫
2026-06-29 20:29:59
范戴克谈点球大战:很煎熬!我们练了那么多,结果最后还是出局了

范戴克谈点球大战:很煎熬!我们练了那么多,结果最后还是出局了

云隐南山
2026-06-30 13:45:07
马特乌斯:德国队必须换帅了,球队内部因家属团随行存在矛盾

马特乌斯:德国队必须换帅了,球队内部因家属团随行存在矛盾

懂球帝
2026-06-30 16:41:28
四大顶级AI对决《文明VI》!Claude「核平」法国,结果还是输了

四大顶级AI对决《文明VI》!Claude「核平」法国,结果还是输了

新智元
2026-06-28 09:35:59
一夜之间,房价又给我们开了个天大的玩笑

一夜之间,房价又给我们开了个天大的玩笑

细说职场
2026-06-30 10:49:22
油价调整通知!预期跌幅,汽柴油价格将会继续大跌0.61元/升-0.73元/升!

油价调整通知!预期跌幅,汽柴油价格将会继续大跌0.61元/升-0.73元/升!

肥东论坛
2026-06-29 22:55:39
中国最“穷”的6个铁饭碗行业:表面体面风光,实际工资低到想哭

中国最“穷”的6个铁饭碗行业:表面体面风光,实际工资低到想哭

一口娱乐
2026-06-28 15:10:19
毛岸英入朝作战牺牲,主要责任人是谁?毛主席其实早就点明过真相

毛岸英入朝作战牺牲,主要责任人是谁?毛主席其实早就点明过真相

听风行天涯
2026-06-25 17:37:54
电影一箭三雕:向华强投资没了、韩红公益黄了、冯小刚地位不保了

电影一箭三雕:向华强投资没了、韩红公益黄了、冯小刚地位不保了

奇史怪谈
2026-06-30 09:01:39
调查发现:喜欢锻炼的人,患脑梗概率,比久坐不动的人高10倍不止

调查发现:喜欢锻炼的人,患脑梗概率,比久坐不动的人高10倍不止

重庆头条官方
2026-06-30 10:33:35
“一根白色柱子,毁了学校招牌”,合肥高校火了,女生却很兴奋

“一根白色柱子,毁了学校招牌”,合肥高校火了,女生却很兴奋

世界圈
2026-06-30 08:17:46
纪委监委能恢复你多久前删掉的微信?答案可能让你睡不着觉

纪委监委能恢复你多久前删掉的微信?答案可能让你睡不着觉

黑哥讲现代史
2026-05-21 13:52:20
为什么往死里扫黄?网友分享太真实了,一次说透

为什么往死里扫黄?网友分享太真实了,一次说透

另子维爱读史
2026-05-27 20:16:03
日本饮料之王:用汉字伪装身份,年收入超60亿,一度被误认是国货

日本饮料之王:用汉字伪装身份,年收入超60亿,一度被误认是国货

小兰聊历史
2026-06-29 12:13:29
苏提达巴黎出尽风头!73岁布丽吉特发型翻车,泰王冷脸看女儿下跪

苏提达巴黎出尽风头!73岁布丽吉特发型翻车,泰王冷脸看女儿下跪

白露文娱志
2026-06-30 15:19:46
2026-06-30 18:47:00
linux系统运维之家
linux系统运维之家
科技资讯
1392文章数 7550关注度
往期回顾 全部

科技要闻

iPhone18 Pro遭泄密!印度代工商惹祸

头条要闻

无人机攻防正酣 乌克兰却在此时给俄罗斯出了个难题

头条要闻

无人机攻防正酣 乌克兰却在此时给俄罗斯出了个难题

体育要闻

大热倒灶压力给到法国 王楚揭法国队隐患

娱乐要闻

韩红称要退出公益,多位名人挽留

财经要闻

韩国万亿"芯"基建:存储能否成AI时代油田

汽车要闻

奇瑞风云A9探店 五个理由一定来看看

态度原创

家居
健康
房产
艺术
公开课

家居要闻

传奇筑 日常诗

狂吃“糯叽叽”小心肠梗阻!

房产要闻

等了三年!改善顶流实景交付,海口标杆的的答卷来了!

艺术要闻

《争座位帖》唐代双钩本现身,填补书坛空白

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版