您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:Python机器学习之底层实现KNN

51自学网 2021-10-30 22:27:23
  python
这篇教程Python机器学习之底层实现KNN写得很实用,希望能帮到您。

一、导入数据

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

代码如下(示例):

import pandas as pddef 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 npdef 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算是机器学习中最简单的算法,实现起来相对简单,但对于我这样的新手,还是花费了大半天时间才整出来。

在github上传了项目:https://github.com/chenyi369/KNN

到此这篇关于Python机器学习之底层实现KNN的文章就介绍到这了,更多相关Python底层实现KNN内容请搜索51zixue.net以前的文章或继续浏览下面的相关文章希望大家以后多多支持51zixue.net!


利用python进行数据加载
Python虚拟环境virtualenv是如何使用的
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。