关闭

[置顶] 基于属性值相关距离的KNN算法

标签: pythonknn分类器机器学习
549人阅读 评论(0) 收藏 举报
分类:

该博客的观点来自于中国知网上由肖辉辉和段艳明执笔的论文《基于属性值相关距离的KNN算法的改进研究》。我只是因为最近做项目,老师分配任务研究KNN算法的改进而找到这篇论文,最后把论文中的算法代码。


这里写图片描述
这里写图片描述
这里写图片描述


下面是Python代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/3/29 0029 19:15
# @Author  : Aries
# @Site    : 
# @File    : FCD_KNN.py
# @Software: PyCharm Community Edition

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn import neighbors
from sklearn.model_selection import train_test_split
import operator

def Feature_Correlation_Distance(Train_Data,Test_Data):
    """
    这是计算测试集与训练集之间的属性值相关距离的函数
    :param Train_Data: 训练集
    :param Test_Data: 测试集
    :return: 返回测试集与训练集之间的属性值相关距离
    """

    #计算测试集与训练集之间的相关系数
    feature_correlation_distance = []
    for j in range(len(Train_Data)):
        cov = []
        cov.append(Test_Data)
        train_data = Train_Data[j,:]
        cov.append(train_data)
        cov = np.cov(cov)
       # print(cov)
        corr = cov[1, 0] / ((cov[0, 0] ** 0.5) * (cov[1, 1] ** 0.5))
        corr_dist = 1 - corr
        feature_correlation_distance.append(corr_dist)
    feature_correlation_distance = np.array(feature_correlation_distance)
    return feature_correlation_distance

def class_reliability(Train_Label,class_count,feature_correlation_distance,feature_correlation_nearest_distance_index):
    """
    这是求测试样本与训练集之间的类可信度函数
    :param Train_Label: 训练标签
    :param class_count: 类标签计数字典
    :param feature_correlation_distance: 测试集与训练集之间的属性值相关距离
    :param feature_correlation_nearest_distance_index: 测试集与训练集之间的最近k个属性值相关距离的下标
    :return: 返回测试样本的预测分类
    """

    #计算每个可能分类的类可信度
    Realiability = {}
    n = len(feature_correlation_nearest_distance_index)
    for i in range(len(class_count)):
        nr = class_count[i][1]
        predict_label = class_count[i][0]
        sum = 0
        for j in range(n):
            nearest_index = feature_correlation_nearest_distance_index[j]
            if Train_Label[nearest_index] == predict_label:
                sum = sum + feature_correlation_distance[nearest_index]
        realiability = (n - nr) * sum / ( n ** 2)
        Realiability[realiability] = predict_label
    print(Realiability)
    print("rwdsfsdaf")
    Realiability = sorted(Realiability.items(),key = operator.itemgetter(0),reverse = False)
    print(Realiability)
    return Realiability[0][1]

def FCD_KNN(Train_Data,Train_Label,Test_Data,Test_Label,k):
    """
    这是FCD_KNN分类算法
    :param Train_Data:训练集数据
    :param Train_Label: 训练集标签
    :param Test_Data: 测试集数据
    :param Test_Label: 测试集标签
    :param k: 分类的种类
    """

    test_labels = []
    error = 0.0
    for i in range(len(Test_Data)):
        class_count = {}
        test_data = Test_Data[i]
        # 求出测试集与训练集之间的属性值相关距离
        feature_correlation_distance = Feature_Correlation_Distance(Train_Data, test_data)
        # 对feature_correlation_distance从小到大排序,返回相应的数组下标数组
        feature_correlation_distance_index = feature_correlation_distance.argsort()
        feature_correlation_nearest_distance_index = []
        for j in range(k):
            vote_label = Train_Label[feature_correlation_distance_index[j]]
            class_count[vote_label] = class_count.get(vote_label, 0) + 1
            feature_correlation_nearest_distance_index.append(feature_correlation_distance_index[j])
        print(class_count)
        print("wrwfsdsfd")
        class_count = sorted(class_count.items(),key = operator.itemgetter(1),reverse = True)
        print(class_count)
        test_label = class_reliability(Train_Label,class_count,feature_correlation_distance,feature_correlation_nearest_distance_index)
        test_labels.append(test_label)
        if test_label != Test_Label[i]:
            error = error + 1.0
    return error*1.0/len(Test_Data)

def autoNorm(Data):
    """
    :param Data: 需要进行归一化的数据
    :return: 进行Max-Min标准化的数据
    """

    #求出数据中每列的最大值,最小值,以及相应的范围
    data_min = Data.min(0)
    data_max = Data.max(0)
    data_range = data_max-data_min

    #进行归一化
    m = np.shape(Data)[0]
    Norm_Data = Data - np.tile(data_min,(m,1))
    Norm_Data = Norm_Data / data_range

    return Norm_Data

def run_main():
    """
    这是实现FCD_KNN分类算法的主函数
    """

    #导入Iris数据
    Iris = datasets.load_iris()
    Iris_Data = Iris.data
    Iris_Label = Iris.target

    #数据归一化
    Iris_Norm_Data = autoNorm(Iris_Data)

    #训练,测试数据分割
    Iris_Train_Data,Iris_Test_Data,Iris_Train_Label,Iris_Test_Label = train_test_split(Iris_Norm_Data,Iris_Label,test_size= 1/3,random_state= 10)

    #FCD_KNN分类算法
    Error_FCD_KNN= []
    K = np.arange(3,30,1)
    for k in K:
        error = FCD_KNN(Iris_Train_Data,Iris_Train_Label,Iris_Test_Data,Iris_Test_Label,k)
        Error_FCD_KNN.append(error)

    plt.plot(K, Error_FCD_KNN, color='red',label = "FCD_KNN")

    #传统KNN算法,利用sklearn库
    Error_KNN = []
    for k in K:
        KNN = neighbors.KNeighborsClassifier(k)
        KNN.fit(Iris_Train_Data,Iris_Train_Label)
        test_label= KNN.predict(Iris_Test_Data)
        error = 0
        for i in range(len(test_label)):
            if test_label[i] != Iris_Test_Label[i]:
                error = error + 1
        error = error / float(len(test_label))
        Error_KNN.append(error)
    plt.plot(K,Error_KNN,color = 'blue',label = 'KNN')
    plt.legend(bbox_to_anchor = (0.,1.02,1.,.102),loc = 2,ncol = 2)

    plt.title("Error")
    plt.savefig("KNN算法错误率")
    plt.show()


if __name__ == '__main__':
    run_main()

下面是错误率的图像:
这里写图片描述
(PS:从此图可以看出无论自己写的代码有多好,还是比不过开源库。但是在学习期间还是自己多写写,加深理解,这样才能在工作中灵活运用,是的算法不断优化。)

1
0
查看评论

KNN算法中常用的距离计算公式

KNN,英文全称为K-nearst neighbor,中文名称为K近邻算法,它是由Cover和Hart在1968年提出来的。   KNN算法流程:   输入:训练数据集   T=(x1,y1),(x2,y2),...,(xN,yN)T={(x_1,y_1),(x_2,y_2),...,(x_N...
  • sanqima
  • sanqima
  • 2016-04-28 19:52
  • 7247

kNN(K-Nearest Neighbor)最邻近规则分类

KNN最邻近规则,主要应用领域是对未知事物的识别,即判断未知事物属于哪一类,判断思想是,基于欧几里得定理,判断未知事物的特征和哪一类已知事物的的特征最接近; K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:...
  • xlm289348
  • xlm289348
  • 2013-05-02 16:26
  • 82054

K最近邻(KNN,k-Nearest Neighbor)准确理解

用了之后,发现我用的都是1NN,所以查阅了一下相关文献,才对KNN理解正确了,真是丢人了。 左图中,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方...
  • mousever
  • mousever
  • 2016-05-13 21:56
  • 3236

k最近邻(KNN)分类法介绍

1.急切学习与懒惰学习 急切学习:在给定训练元组之后、接收到测试元组之前就构造好泛化(即分类)模型。 属于急切学习的算法有:决策树、贝叶斯、基于规则的分类、后向传播分类、SVM和基于关联规则挖掘的分类等等。   懒惰学习:直至给定一个测试元组才开始构造泛化模型,也称...
  • ccchennn
  • ccchennn
  • 2014-09-29 22:28
  • 529

KNN算法

KNN算法是机器学习里面常用的一种分类算法,假设一个样本空间被分为几类,然后给定一个待分类所有的特征数 据,通过计算距离该数据的最近的K个样本来判断这个数据属于哪一类。如果距离待分类属性最近的K个类大多数都 属于某一个特定的类,那么这个待分类的数据也就属于这个类。   Conten...
  • ACdreamers
  • ACdreamers
  • 2015-03-27 01:26
  • 2993

scikit-learn学习之K最近邻算法(KNN)

kNN算法全称是k-最近邻算法(K-Nearest Neighbor) kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样...
  • Gamer_gyt
  • Gamer_gyt
  • 2016-04-24 11:19
  • 18641

基于属性值相关距离的KNN算法

该博客的观点来自于中国知网上由肖辉辉和段艳明执笔的论文《基于属性值相关距离的KNN算法的改进研究》。我只是因为最近做项目,老师分配任务研究KNN算法的改进而找到这篇论文,最后把论文中的算法代码。 下面是Python代码:#!/usr/bin/env python # -*- coding: u...
  • qq_30091945
  • qq_30091945
  • 2017-03-30 19:22
  • 549

KNN(K-nearest neighbor)理解

先给出一个可以运行的KNN的代码。大家可以先通过运行这个代码,熟悉一下这个简单的分类方法的内容。 #include #include #include #include #include #include #include #include #incl...
  • lk142500
  • lk142500
  • 2015-11-22 17:28
  • 1847

机器学习_基于距离的算法KNN与K-Means

线性回归,logistic回归,支持向量机,KNN,K-Means都属于基于距离的模型。下面以分类问题为例,看看它们之间的关系。
  • xieyan0811
  • xieyan0811
  • 2017-11-28 19:43
  • 241

knn距离公式比较

在数据分析和数据挖掘的过程中,我们经常需要知道个体间差异的大小,进而评价个体的相似性和类别。最常见的是数据分析中的相关分析,数据挖掘中的分类和聚类算法,如K最近邻(KNN)和K均值(K-Means)。当然衡量个体差异的方法有很多,最近查阅了相关的资料,这里整理罗列下。 为了方便下面的解释和举例...
  • ziyubiti
  • ziyubiti
  • 2015-09-09 15:11
  • 1261
    个人资料
    • 访问:155573次
    • 积分:4928
    • 等级:
    • 排名:第6843名
    • 原创:329篇
    • 转载:0篇
    • 译文:0篇
    • 评论:80条
    博客专栏
    最新评论