• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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算是机器学习中最简单的算法,实现起来相对简单,但对于我这样的新手,还是花费了大半天时间才整出来。

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

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

    您可能感兴趣的文章:
    • python 如何通过KNN来填充缺失值
    • python实现KNN近邻算法
    • Python图像识别+KNN求解数独的实现
    • python KNN算法实现鸢尾花数据集分类
    • python运用sklearn实现KNN分类算法
    • 使用python实现kNN分类算法
    • python实现KNN分类算法
    • python使用KNN算法识别手写数字
    上一篇:利用python进行数据加载
    下一篇:Python虚拟环境virtualenv是如何使用的
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Python机器学习之底层实现KNN Python,机器,学,习之,底层,