精华内容
下载资源
问答
  • 在这篇文章中,我将展示如何使用遗传算法进行特征选择。 虽然 scikit-learn 中有许多众所周知的特征选择方法,但特征选择方法还有很多,并且远远超出了scikit-learn 提供的方法。特征选择是机器学习的关键方面之一...

    遗传算法是一种基于自然选择的优化问题的技术。 在这篇文章中,我将展示如何使用遗传算法进行特征选择。

    虽然 scikit-learn 中有许多众所周知的特征选择方法,但特征选择方法还有很多,并且远远超出了scikit-learn 提供的方法。特征选择是机器学习的关键方面之一。 但是因为技术的快速发展,现在是信息大爆炸的时代,有多余的可用数据,因此通常会出现多余的特征。许多特征都是多余的。 它们会为模型增加噪音,并使模型解释出现问题。

    我们面临的问题是确定哪些特征与问题相关。 我们找寻目标是具有高质量的特征。

    遗传算法

    本篇文章使用了“sklearn-genetic”包:

    该软件包与现有的sklearn模型兼容,并为遗传算法的特征选择提供了大量的功能。

    在这篇文章中,我使用遗传算法进行特征选择。但是,遗传算法也可以用于超参数优化。因为这些步骤非常简单和一般化,所以可以适用于许多不同的领域。

    特征选择

    选择特性是一个NP-Hard问题(所有NP问题都能在多项式时间复杂度内归遇到的问题)。给定一组特征,最优配置是这些特征的集合或子集。这种方法是离散选择。在可能性排列的情况下,确定最优特征集的成本是非常高的。

    遗传算法使用一种基于进化的方法来确定最优集。对于特征选择,第一步是基于可能特征的子集生成一个总体(种群)。

    从这个种群中,使用目标任务的预测模型对子集进行评估。一旦确定了种群的每个成员,就会进行竞赛以确定哪些子集将延续到下一代。下一代由竞赛获胜者组成并进行交叉(用其他获胜者的特征更新获胜特征集)和变异(随机引入或删除一些特征)。

    大致的步骤如下:

    1. 产生初始种群
    2. 对种群中的每个成员进行评分
    3. 通过竞赛选择子集进行繁殖
    4. 选择要传递的遗传物质(特征)
    5. 应用突变
    6. 以上步骤重复多次,每一次成为一代(generation)

    该算法运行一定数量的代之后,群体的最优成员就是选定的特征。

    实际操作

    实验基于 UCI 乳腺癌数据集,其中包含 569 个实例和 30 个特征。 使用这个数据集,我测试了几个分类器的所有特征、遗传算法的特征子集以及使用卡方检验的五个特征进行比较。

    下面是用于使用遗传算法选择最多五个特征的代码。

    from sklearn.datasets import load_breast_cancer
    from genetic_selection import GeneticSelectionCV
    from sklearn.tree import DecisionTreeClassifier
    import pandas as pd
    import numpy as npdata = load_breast_cancer()
    df = pd.DataFrame(data.data, columns=data.feature_names)
    df['target'] = data.target
    X = df.drop(['target'], axis=1)
    y = df['target'].astype(float)estimator = DecisionTreeClassifier()
    model = GeneticSelectionCV(
        estimator, cv=5, verbose=0,
        scoring="accuracy", max_features=5,
        n_population=100, crossover_proba=0.5,
        mutation_proba=0.2, n_generations=50,
        crossover_independent_proba=0.5,
        mutation_independent_proba=0.04,
        tournament_size=3, n_gen_no_change=10,
        caching=True, n_jobs=-1)
    model = model.fit(X, y)
    print('Features:', X.columns[model.support_])
    

    GeneticSelectionCV

    初始种群(大小为“n_population”)是从特征集的样本空间中随机生成的。 这些集合的范围受参数“max_features”的限制,该参数设置每个特征子集的最大大小。

    对于初始种群的每个成员,使用目标度量来衡量一个分数。 此度量是指定的估算器的性能。

    进行竞赛选择以确定哪些成员将继续到下一代。 竞赛中的成员数量由“tournament_size”设置。 竞赛规模是根据评分指标从总体中选出的几个成员相互竞争。获胜者被选为下一代的父母。

    参加竞赛的成员人数应该很少。 当值比较大时,通常选择当前最好的成员。 此行为不会导致选择任何较弱的成员。 对于较弱的成员,虽然提供了暂时的性能提升,但最终这会导致整体性能的降低,因为较弱的选项没有得到改进的机会。

    自然选择

    在自然选择中,遗传信息存储在染色体中。在繁殖过程中一些遗传物质从父母传给孩子。然后孩子包含来自父母双方的遗传物质。此属性用参数“crossover_proba”表示。指定的概率表示从一个生成交叉到下一个生成的机会。还有一个参数“crossover_independent_proba”,它是一个特征将交叉到子节点的概率。

    进化的一个关键方面是突变。变异降低了搜索陷入局部最优被卡住的风险。在每一代中除了交叉之外,还添加了一个随机突变。突变发生的概率由参数“mutation_prob”设置。此参数与“mutation_independent_proba”结合,这是向特征集添加特征的机会。

    值得注意的是,将此概率设置得太高会将算法转换为随机选择过程。因此将此值设置在相对较低的水平。在每一代中随机引入特征可以有效地作为遗传过程的正则化。

    此处使用的遗传搜索算法还有一个“n_gen_no_change”参数,用于监控种群中最好的成员是否在几代中没有发生变化。在这种情况下,搜索是否找到了一个最佳选择。是否考虑增加突变或交叉概率以进一步改变选择。

    结果

    遗传与卡方特征选择的结果如下所示。还列出了使用所有特性的基准性能。结果来自交叉验证,使用准确性作为度量标准,使用的特征数量在括号中显示。

    虽然这些结果不是决定性的,但它们显示了遗传算法的好处。 模型性能基于遗传算法的特征子集,该子集始终优于基线模型和卡方特征子集。 逻辑回归模型是一个例外,其结果仍然具有可比性。

    此外,产生的最佳特征子集小于五个特征的最大值。 具有较少特征的模型最终比较大的模型更受青睐,因为它们更简单且更易于解释。

    总结

    遗传算法非常通用,适用于广泛的场景。

    这篇文章探讨了如何使用 sklearn-genetic 包将遗传算法用于特征选择。 这些算法也已被证明在超参数搜索和生成式设计中是有效的。

    虽然不像 sklearn 中现成的方法那么传统,但遗传算法提供了一种独特而实用的特征选择方法。 这些算法优化的方式与大多数其他特征选择方法有很大不同。 该过程基于纯自然选择方法。

    我鼓励数据科学家花时间在他们的工作中理解和实施遗传算法。

    作者:Zachary Warnes

    展开全文
  • 本教程主要使用numpy和sklearn来讨论如何使用遗传算法(genetic algorithm,GA)来减少从python中的Fruits360数据集提取的特征向量。标签:深度学习,特征工程,遗传算法,神经网络,numpy,python,scikit-learn本...

    作者:Ahmed Gad

    翻译:张睿毅

    校对:丁楠雅

    本文4700字,建议阅读15分钟。

    本教程主要使用numpy和sklearn来讨论如何使用遗传算法(genetic algorithm,GA)来减少从python中的Fruits360数据集提取的特征向量。

    标签:深度学习,特征工程,遗传算法,神经网络,numpy,python,scikit-learn

    本教程主要使用numpy和sklearn来讨论如何使用遗传算法(genetic algorithm,GA)来减少从python中的Fruits360数据集提取的特征向量。

    导言

    在某些情况下,使用原始数据训练机器学习算法可能不是合适的选择。该算法在接受原始数据训练时,必须进行特征挖掘,以检测不同组之间的差异。但这需要大量的数据来自动执行特征挖掘。对于小数据集,数据科学家最好自己进行特征挖掘步骤,之后告诉机器学习算法要使用哪个特征集。

    使用的特征集必须能代表数据样本,因此我们必须注意选择最佳特征。数据科学家建议使用一些类型的特征,这些特征似乎有助于根据以前的经验来表示数据样本。一些特征可以证明它们在表示样本时的稳健性,而其他特征则不能。

    可能存在一些类型的特征,会降低分类问题的准确性或增加回归问题的误差,进而影响训练模型的结果。例如,特征向量中可能存在一些噪音元素,因此它们应该被删除。特征向量也可能包含2个或更多相关元素。只使用一个元素就可以替代另一个元素。为了删除这些类型的元素,有两个有用的步骤,即特征选择和约简。本教程重点介绍特征约简。

    假设有3个特征f1、f2和f3,每个特征都有3个特征元素。因此,特征向量长度为3x3=9。特征选择只选择特定类型的特征,不包括其他类型的特征。例如,只需选择f1和f3并删除f3。特征向量长度变成了6而不是9。在特征约简中,可以排除每个特征的特定元素。例如,此步骤可能会在保留第二个元素的同时从f3中删除第一个和第三个元素。因此,特征向量长度从9减少到7。

    在开始本教程之前,值得一提的是,它是我的LinkedIn配置文件中先前发布的2个教程的扩展。

    第一个教程的标题是“使用numpy的人工神经网络实现Fruits360图像数据集的分类”。它首先从Fruits360数据集的4个类中提取长度为360的特征向量。然后,利用numpy从零开始构建人工神经网络(ANN),对数据集进行分类。

    第一个教程可从以下网址获取:https://www.linkedin.com/pulse/artificial-neural-network-implementation-using-numpy-fruits360-gad其Github项目可从以下网址获得:https://github.com/ahmedfgad/NumPyAN

    第二个教程是“使用遗传算法的人工神经网络优化”。建立并使用遗传算法对神经网络参数进行优化,以提高分类精度。

    第二个教程可从以下网址获取:https://www.linkedin.com/pulse/artificial-neural-networks-optimization-using-genetic-ahmed-gad。其Github项目也可从以下网址获得:https://github.com/ahmedfgad/NeuralGeneti

    本教程讨论了如何使用遗传算法来减少从长度360的Fruits360数据集中提取的特征向量。本教程首先讨论要遵循的步骤。其次通过使用NumPy和Sklearn在python实现这些步骤。

    本教程的实现可在我的Github页面中找到:https://github.com/ahmedfgad/FeatureReductionGeneti

    遗传算法从一个初始群体开始,该群体由若干染色体(即解决方法)组成,其中每个染色体都有一系列基因。使用适应函数,遗传算法选择最佳的解决方案作为父母来创建一个新的群体。在这样一个新的群体中,通过在双亲上应用两个操作,即杂交和变异来创建新的解决方案。当把遗传算法应用到一个给定的问题上时,我们必须确定基因的表示、合适的适应函数以及杂交和变异是如何应用的。接下来让我们看看运行原理。

    更多关于遗传算法的信息

    你可以从我准备的如下资源中读到关于遗传算法的更多知识:

    1. 遗传算法优化介绍

    https://www.linkedin.com/pulse/introduction-optimization-genetic-algorithm-ahmed-gad/https://www.kdnuggets.com/2018/03/introduction-optimization-with-genetic-algorithm.htmlhttps://towardsdatascience.com/introduction-to-optimization-with-genetic-algorithm-2f5001d9964b

    2. 遗传算法优化-逐步示例

    https://www.slideshare.net/AhmedGadFCIT/genetic-algorithm-ga-optimization-stepbystep-example

    3. python中的遗传算法实现

    https://www.linkedin.com/pulse/genetic-algorithm-implementation-python-ahmed-gad/https://www.kdnuggets.com/2018/07/genetic-algorithm-implementation-python.htmlhttps://towardsdatascience.com/genetic-algorithm-implementation-in-python-5ab67bb124a6https://github.com/ahmedfgad/GeneticAlgorithmPython

    我在2018年还写了一本书,其中一章介绍了遗传算法。这本书的标题是“利用CNN进行深度学习的实用计算机视觉应用”,可在Springer上找到。

    Springer链接:https://www.springer.com/us/book/978148424166

    染色体的表达

    遗传算法中的基因是染色体的组成部分。首先,我们需要确定染色体内的基因。为此,考虑到可能影响结果的每一种属性都应被视为一个基因。因为我们问题的目标是选择最好的一组特征元素,所以如果选择或不选择,每个特征元素都可能影响结果。因此,每个特征元素都被视为一个基因。染色体将由所有基因(即所有特征元素)组成。因为有360个特征元素,那么就有360个基因。一个很好的信息现在很清楚,染色体的长度是360。

    在确定所选基因是什么之后,下一步就是确定基因的表达。有不同的表示形式,如十进制、二进制、浮点、字符串等。我们的目标是知道基因(即特征元素)是否在减少的特征集中被选择。因此,分配给基因的值应该反映它是否被选择。基于这种描述,很明显每个基因有两个可能的值。一个值表示该基因已被选中,另一个值表示未被选中。因此,二进制表示是最佳选择。当基因值为1时,将在减少的特征集中进行选择。当为0时,则忽略它。

    总之,染色体将由360个基因组成,以二进制表示。根据下一个图,特征向量和染色体之间有一对一的映射。这是染色体中的第一个基因与特征向量中的第一个元素相连。当该基因的值为1时,这意味着选择了特征向量中的第一个元素。

    适应函数

    通过了解如何创建染色体,可以很容易地对初始种群进行随机初始化。初始化后,将选择父级。遗传算法基于达尔文的“适者生存”理论。这是目前选择的最佳解决方案进行组合,以产生更好的解决方案。通过保留好的解和消除坏的解,我们可以得到最优或半最优解。

    选择双亲的标准是与每个解决方案(即染色体)相关联的适应值。适合度越高,解决方案越好。使用适应度函数计算适应度值。那么,在我们的问题中,最适合使用的功能是什么?我们问题的目标是创建一个约简的特征向量,以提高分类精度。因此,判断一个解是否好的标准是分类的准确性。因此,fitness函数将返回一个数字,指定每个解决方案的分类精度。精度越高,解决方案越好。

    为了返回分类的准确度,必须有一个机器学习模型来通过每个解决方案返回的特征元素进行训练。对于这种情况,我们将使用支持向量分类器(SVC)。

    数据集分为训练样本和测试样本。根据训练数据,SVC将使用人群中每个解决方案选择的特征元素进行训练。经过训练后,根据测试数据进行测试。

    根据每个解的适合度值,我们可以选择其中最好的作为父母。这些父母被放在一起组合以产生后代,这将是下一代的新人口的成员。这种后代是通过对选定的亲本应用交叉和突变操作而产生的。让我们按照下面讨论的方式配置这些操作。

    遗传和变异

    基于适应度函数,我们可以筛选出当前群体中的最优解,即父辈。遗传算法假设匹配2个好的解决方案将产生第三个更好的解决方案。组合意味着从两个父母那里交换一些基因。使用遗传操作交换基因。有不同的方法可以应用这种操作。本教程使用单点交叉,其中一个点分割染色体。点前的基因取自一组解,点后的基因取自另一组解。

    通过应用遗传,所有的基因都来自于以前的父母。在新的后代中没有引入新的基因。如果所有的父母都有一个坏基因,那么这个基因就会转移到后代身上。正因为如此,为了在后代中引入新的基因,采用了突变操作。在基因的二元表示中,突变是通过翻转一些随机选择的基因的值来实现的。如果基因值为1,则为0,反之亦然。

    在产生后代之后,我们可以创造下一代的新种群。除了后代之外,这个群体还包括以前的父辈。

    此时,将讨论所有步骤。接下来是用Python实现它们。注意,我以前写过一篇题为“Python中的遗传算法实现”的教程,用于在Python中实现遗传算法,我将修改它的代码来解决我们的问题。最好读一下。

    利用Python实现

    该项目分为两个文件。一个文件名为GA.py,它将遗传算法步骤的实现保存为函数。另一个文件是主文件,它只导入这个文件,并在循环中调用它的函数,该循环将迭代几代。

    根据下面的代码,主文件首先读取从Fruits360数据集提取的特性。这些特性返回到数据输入变量中。有关提取这些功能的详细信息,请参阅本教程开头提到的2个教程。该文件还读取与数据输出变量中的样本相关联的类标签。

    选择一些样本进行训练,其索引存储在train_indices变量中。同样,测试样本索引存储在test_indices变量中。

    import numpyimport GAimport pickleimport matplotlib.pyplotf = open('dataset_features.pkl', 'rb')data_inputs = pickle.load(f)f.close()f = open('outputs.pkl', 'rb')data_outputs = pickle.load(f)f.close()num_samples = data_inputs.shape[0]num_feature_elements = data_inputs.shape[1]train_indices = numpy.arange(1, num_samples, 4)test_indices = numpy.arange(0, num_samples, 4)print('Number of training samples: ', train_indices.shape[0])print('Number of test samples: ', test_indices.shape[0])'''Genetic algorithm parameters: Population size Mating pool size Number of mutations'''sol_per_pop = 8 # Population size.num_parents_mating = 4 # Number of parents inside the mating pool.num_mutations = 3 # Number of elements to mutate.# Defining the population shape.pop_shape = (sol_per_pop, num_feature_elements)# Creating the initial population.new_population = numpy.random.randint(low=0, high=2, size=pop_shape)print(new_population.shape)best_outputs = []num_generations = 100

    它初始化了遗传算法的所有参数。这包括根据sol_per_pop变量设置为8的每个群体的解的数量、num _parents_mating变量设置为4的子代数量以及num_mutations变量设置为3的突变数量。之后,它会在一个名为“new_population”的变量中随机创建初始总体。

    有一个名为best_outputs的空列表,它在每一代之后都保存着最好的结果。这有助于可视化遗传算法在完成所有代之后的进展。num_generations变量中的代数设置为100。请注意,您可以更改所有这些参数,从而获得更好的结果。

    在准备好特性、类标签和算法参数之后,我们可以根据下一个代码对算法进行迭代。首先,通过调用GA文件中定义的名为cal_pop_fitness()的适应函数来计算所有解决方案的适应值。此函数接受当前总体、提取的特征、类标签、列车索引和测试索引。函数返回名为fitness的变量中所有解的适应值。请记住,适合度值表示分类精度。最佳(即最高)分类精度保存在最佳输出列表中。

    根据计算出的适合度值,使用GA.py文件中定义的select_matching_pool()函数选择分类精度最高的最佳解决方案作为匹配池中的父级。它接受当前的人口、适合度值和要返回的父母人数。它将所选双亲返回到父级变量中。for generation in range(num_generations): print('Generation : ', generation) # Measuring the fitness of each chromosome in the population. fitness = GA.cal_pop_fitness(new_population, data_inputs, data_outputs, train_indices, test_indices) best_outputs.append(numpy.max(fitness)) # The best result in the current iteration. print('Best result : ', best_outputs[-1]) # Selecting the best parents in the population for mating parents = GA.select_mating_pool(new_population, fitness, num_parents_mating) # Generating next generation using crossover offspring_crossover = GA.crossover(parents, offspring_size=(pop_shape[0]-parents.shape[0], num_feature_elements)) # Adding some variations to the offspring using mutation. offspring_mutation = GA.mutation(offspring_crossover, num_mutations=num_mutations) # Creating the new population based on the parents and offspring. new_population[0:parents.shape[0], :] = parents new_population[parents.shape[0]:, :] = offspring_mutation

    接下来是对选定的父代应用组合操作以创建子代。这是在GA.py文件中定义的crossover()函数内完成的。它接受父数组和子数组的形状,以便稍后返回到offspring_crossover变量中。然后,使用在GA.py文件中也可用的mutation()函数在该数组上应用突变操作。除了交叉结果,这个函数接受突变的数量。

    因为新的种群由选定的亲本和后代组成,所以亲本和offspring_crossover数组都保存到new_population变量中。在那之后,新一代被应用于新的人口。

    在所有代完成后,将执行下一个代码,以返回最佳选择的功能元素集和所选元素的数量。在100代完成后,该算法使用174个特征元素,以达到99.59%的精度。

    fitness = GA.cal_pop_fitness(new_population, data_inputs, data_outputs, train_indices, test_indices)# Then return the index of that solution corresponding to the best fitness.best_match_idx = numpy.where(fitness == numpy.max(fitness))[0]best_match_idx = best_match_idx[0]best_solution = new_population[best_match_idx, :]best_solution_indices = numpy.where(best_solution == 1)[0]best_solution_num_elements = best_solution_indices.shape[0]best_solution_fitness = fitness[best_match_idx]print('best_match_idx : ', best_match_idx)print('best_solution : ', best_solution)print('Selected indices : ', best_solution_indices)print('Number of selected elements : ', best_solution_num_elements)print('Best solution fitness : ', best_solution_fitness)matplotlib.pyplot.plot(best_outputs)matplotlib.pyplot.xlabel('Iteration')matplotlib.pyplot.ylabel('Fitness')matplotlib.pyplot.show()

    上面的代码展示了一张图,显示了算法在所有代中的进度,如下所示。

    以下是主文件中的完整代码。import numpyimport GAimport pickleimport matplotlib.pyplotf = open('dataset_features.pkl', 'rb')data_inputs = pickle.load(f)f.close()f = open('outputs.pkl', 'rb')data_outputs = pickle.load(f)f.close()num_samples = data_inputs.shape[0]num_feature_elements = data_inputs.shape[1]train_indices = numpy.arange(1, num_samples, 4)test_indices = numpy.arange(0, num_samples, 4)print('Number of training samples: ', train_indices.shape[0])print('Number of test samples: ', test_indices.shape[0])'''Genetic algorithm parameters: Population size Mating pool size Number of mutations'''sol_per_pop = 8 # Population sizenum_parents_mating = 4 # Number of parents inside the mating pool.num_mutations = 3 # Number of elements to mutate.# Defining the population shape.pop_shape = (sol_per_pop, num_feature_elements)# Creating the initial population.new_population = numpy.random.randint(low=0, high=2, size=pop_shape)print(new_population.shape)best_outputs = []num_generations = 100for generation in range(num_generations): print('Generation : ', generation) # Measuring the fitness of each chromosome in the population. fitness = GA.cal_pop_fitness(new_population, data_inputs, data_outputs, train_indices, test_indices) best_outputs.append(numpy.max(fitness)) # The best result in the current iteration. print('Best result : ', best_outputs[-1]) # Selecting the best parents in the population for mating. parents = GA.select_mating_pool(new_population, fitness, num_parents_mating) # Generating next generation using crossover. offspring_crossover = GA.crossover(parents, offspring_size=(pop_shape[0]-parents.shape[0], num_feature_elements)) # Adding some variations to the offspring using mutation. offspring_mutation = GA.mutation(offspring_crossover, num_mutations=num_mutations) # Creating the new population based on the parents and offspring. new_population[0:parents.shape[0], :] = parents new_population[parents.shape[0]:, :] = offspring_mutation # Getting the best solution after iterating finishing all generations.# At first, the fitness is calculated for each solution in the final generation.fitness = GA.cal_pop_fitness(new_population, data_inputs, data_outputs, train_indices, test_indices)# Then return the index of that solution corresponding to the best fitness.best_match_idx = numpy.where(fitness == numpy.max(fitness))[0]best_match_idx = best_match_idx[0]best_solution = new_population[best_match_idx, :]best_solution_indices = numpy.where(best_solution == 1)[0]best_solution_num_elements = best_solution_indices.shape[0]best_solution_fitness = fitness[best_match_idx]print('best_match_idx : ', best_match_idx)print('best_solution : ', best_solution)print('Selected indices : ', best_solution_indices)print('Number of selected elements : ', best_solution_num_elements)print('Best solution fitness : ', best_solution_fitness)matplotlib.pyplot.plot(best_outputs)matplotlib.pyplot.xlabel('Iteration')matplotlib.pyplot.ylabel('Fitness')matplotlib.pyplot.show()

    GA.py的实现

    GA.py文件的实现如下所示。在cal_pop_fitness()函数中,SVC根据每个解决方案选择的特征元素进行培训。在训练前,根据所选的基因值为1的元素过滤特征。这是在reduce_features()函数中完成的。除了所有示例的完整功能外,它还接受当前的解决方案。

    训练后,使用reduce_features()函数计算分类精度。此函数返回存储在cal pop_fitness()函数中名为accuracies的数组中的精度。

    crossover()和mutation()函数的实现与我之前的教程“Python中的遗传算法实现”中讨论的非常相似。一个主要的区别是,mutation()函数通过翻转随机选择的基因的值来改变它们,因为我们使用的是二进制表示。

    import numpyimport sklearn.svmdef reduce_features(solution, features): selected_elements_indices = numpy.where(solution == 1)[0] reduced_features = features[:, selected_elements_indices] return reduced_featuresdef classification_accuracy(labels, predictions): correct = numpy.where(labels == predictions)[0] accuracy = correct.shape[0]/labels.shape[0] return accuracydef cal_pop_fitness(pop, features, labels, train_indices, test_indices): accuracies = numpy.zeros(pop.shape[0]) idx = 0 for curr_solution in pop: reduced_features = reduce_features(curr_solution, features) train_data = reduced_features[train_indices, :] test_data = reduced_features[test_indices, :] train_labels = labels[train_indices] test_labels = labels[test_indices] SV_classifier = sklearn.svm.SVC(gamma='scale') SV_classifier.fit(X=train_data, y=train_labels) predictions = SV_classifier.predict(test_data) accuracies[idx] = classification_accuracy(test_labels, predictions) idx = idx + 1 return accuraciesdef select_mating_pool(pop, fitness, num_parents): # Selecting the best individuals in the current generation as parents for producing the offspring of the next generation. parents = numpy.empty((num_parents, pop.shape[1])) for parent_num in range(num_parents): max_fitness_idx = numpy.where(fitness == numpy.max(fitness)) max_fitness_idx = max_fitness_idx[0][0] parents[parent_num, :] = pop[max_fitness_idx, :] fitness[max_fitness_idx] = -99999999999 return parentsdef crossover(parents, offspring_size): offspring = numpy.empty(offspring_size) # The point at which crossover takes place between two parents. Usually, it is at the center. crossover_point = numpy.uint8(offspring_size[1]/2) for k in range(offspring_size[0]): # Index of the first parent to mate. parent1_idx = k%parents.shape[0] # Index of the second parent to mate. parent2_idx = (k+1)%parents.shape[0] # The new offspring will have its first half of its genes taken from the first parent. offspring[k, 0:crossover_point] = parents[parent1_idx, 0:crossover_point] # The new offspring will have its second half of its genes taken from the second parent. offspring[k, crossover_point:] = parents[parent2_idx, crossover_point:] return offspringdef mutation(offspring_crossover, num_mutations=2): mutation_idx = numpy.random.randint(low=0, high=offspring_crossover.shape[1], size=num_mutations) # Mutation changes a single gene in each offspring randomly. for idx in range(offspring_crossover.shape[0]): # The random value to be added to the gene. offspring_crossover[idx, mutation_idx] = 1 - offspring_crossover[idx, mutation_idx] return offspring_crossover

    原文标题:

    Feature Reduction using Genetic Algorithm with Python

    原文链接:

    https://www.kdnuggets.com/2019/03/feature-reduction-genetic-algorithm-python.html

    译者简介

    张睿毅,北京邮电大学大二物联网在读。我是一个爱自由的人。在邮电大学读第一年书我就四处跑去蹭课,折腾整一年惊觉,与其在当下焦虑,不如在前辈中沉淀。于是在大二以来,坚持读书,不敢稍歇。资本主义国家的科学观不断刷新我的认知框架,同时因为出国考试很早出分,也更早地感受到自己才是那个一直被束缚着的人。太多真英雄在社会上各自闪耀着光芒。这才开始,立志终身向遇到的每一个人学习。做一个纯粹的计算机科学里面的小学生。

    展开全文
  • 研究图像特征检测已经有一段时间了,图像特征检测的方法很多,又加上各种算法的变形,所以难以在短时间内全面的了解,只是对主流的特征检测算法的原理进行了学习。总体来说,图像特征可以包括颜色特征、...

    研究图像特征检测已经有一段时间了,图像特征检测的方法很多,又加上各种算法的变形,所以难以在短时间内全面的了解,只是对主流的特征检测算法的原理进行了学习。总体来说,图像特征可以包括颜色特征、纹理特等、形状特征以及局部特征点等。其中局部特点具有很好的稳定性,不容易受外界环境的干扰,本篇文章也是对这方面知识的一个总结。

    本篇文章现在(2015/1/30)只是以初稿的形式,列出了主体的框架,后面还有许多地方需要增加与修改,例如2013年新出现的基于非线性尺度空间的KAZE特征提取方法以及它的改进AKATE等。在应用方面,后面会增一些具有实际代码的例子,尤其是基于特征点的搜索与运动目标跟踪方面。

    1. 局部特征点

    图像特征提取是图像分析与图像识别的前提,它是将高维的图像数据进行简化表达最有效的方式,从一幅图像的M×N×3的数据矩阵中,我们看不出任何信息,所以我们必须根据这些数据提取出图像中的关键信息,一些基本元件以及它们的关系。

    局部特征点是图像特征的局部表达,它只能反正图像上具有的局部特殊性,所以它只适合于对图像进行匹配,检索等应用。对于图像理解则不太适合。而后者更关心一些全局特征,如颜色分布,纹理特征,主要物体的形状等。全局特征容易受到环境的干扰,光照,旋转,噪声等不利因素都会影响全局特征。相比而言,局部特征点,往往对应着图像中的一些线条交叉,明暗变化的结构中,受到的干扰也少。

    而斑点与角点是两类局部特征点。斑点通常是指与周围有着颜色和灰度差别的区域,如草原上的一棵树或一栋房子。它是一个区域,所以它比角点的噪能力要强,稳定性要好。而角点则是图像中一边物体的拐角或者线条之间的交叉部分。

    2. 斑点检测原理与举例

    2.1 LoG与DoH

    斑点检测的方法主要包括利用高斯拉普拉斯算子检测的方法(LOG),以及利用像素点Hessian矩阵(二阶微分)及其行列式值的方法(DOH)。

    LoG的方法已经在斑点检测这入篇文章里作了详细的描述。因为二维高斯函数的拉普拉斯核很像一个斑点,所以可以利用卷积来求出图像中的斑点状的结构。

    DoH方法就是利用图像点二阶微分Hessian矩阵:

    Hessian矩阵行列式的值,同样也反映了图像局部的结构信息。与LoG相比,DoH对图像中的细长结构的斑点有较好的抑制作用。

    无论是LoG还是DoH,它们对图像中的斑点进行检测,其步骤都可以分为以下两步:

    1)使用不同的σ生成模板,并对图像进行卷积运算;

    2)在图像的位置空间与尺度空间中搜索LoG与DoH响应的峰值。

    2.2 SIFT

    详细的算法描述参考:SIFT定位算法关键步骤的说明

    2004年,Lowe提高了高效的尺度不变特征变换算法(SIFT),利用原始图像与高斯核的卷积来建立尺度空间,并在高斯差分空间金字塔上提取出尺度不变性的特征点。该算法具有一定的仿射不变性,视角不变性,旋转不变性和光照不变性,所以在图像特征提高方面得到了最广泛的应用。

    该算法大概可以归纳为三步:1)高斯差分金字塔的构建;2)特征点的搜索;3)特征描述。

    在第一步中,它用组与层的结构构建了一个具有线性关系的金字塔结构,让我们可以在连续的高斯核尺度上查找特征点。它比LoG高明的地方在于,它用一阶高斯差分来近似高斯的拉普拉斯核,大大减少了运算量。

    在第二步的特征点搜索中,主要的关键步骤是极值点的插值,因为在离散的空间中,局部极值点可能并不是真正意义上的极值点,真正的极植点可以落在了离散点的缝隙中。所以要对这些缝隙位置进行插值,然后再求极值点的坐标位置。

    第二步中另一关键环节是删除边缘效应的点,因为只忽略那些DoG响应不够的点是不够的,DoG的值会受到边缘的影响,那些边缘上的点,虽然不是斑点,但是它的DoG响应也很强。所以我们要把这部分点删除。我们利用横跨边缘的地方,在沿边缘方向与垂直边缘方向表现出极大与极小的主曲率这一特性。所以通过计算特征点处主曲率的比值即可以区分其是否在边缘上。这一点在理解上可以参见Harris角点的求法。

    最后一步,即为特征点的特征描述。特征点的方向的求法是需要对特征点邻域内的点的梯度方向进行直方图统计,选取直方图中比重最大的方向为特征点的主方向,还可以选择一个辅方向。在计算特征矢量时,需要对局部图像进行沿主方向旋转,然后再进邻域内的梯度直方图统计(4x4x8)。

    2.3 SURF

    详细的算法描述参考:1. SURF算法与源码分析、上  2. SURF算法与源码分析、下

    2006年,Bay和Ess等人基于SIFT算法的思路,提出了加速鲁棒特征(SURF),该算法主要针对于SIFT算法速度太慢,计算量大的缺点,使用了近似Harr小波方法来提取特征点,这种方法就是基于Hessian行列式(DoH)的斑点特征检测方法。通过在不同的尺度上利用积分图像可以有效地计算出近似Harr小波值,简化了二阶微分模板的构建,搞高了尺度空间的特征检测的效率。

    SURF算法在积分图像上使用了盒子滤波器对二阶微分模板进行了简化,从而构建了Hessian矩阵元素值,进而缩短了特征提取的时间,提高了效率。其中SURF算法在每个尺度上对每个像素点进行检测,其近似构建的Hessian矩阵及其行列式的值分另为:

    其中Dxx,Dxy和Dyy为利用盒子滤波器获得的近似卷积值。如果c(x,y,σ)大于设置的门限值,则判定该像素点为关键字。然后与SIFT算法近似,在以关键点为中心的3×3×3像素邻域内进行非极大值抑制,最后通过对斑点特征进行插值运算,完成了SURF特征点的精确定位。

    而SURF特征点的描述,则也是充分利用了积分图,用两个方向上的Harr小波模板来计算梯度,然后用一个扇形对邻域内点的梯度方向进行统计,求得特征点的主方向。

    3. 角点检测的原理与举例

    角点检测的方法也是极多的,其中具有代表性的算法是Harris算法与FAST算法。

    这两个算法我都有专门写过博文来描述其算法原理。Harris角点和FAST特征点检测。

    3.1 Harris角点特征提取

    Harris角点检测是一种基于图像灰度的一阶导数矩阵检测方法。检测器的主要思想是局部自相似性/自相关性,即在某个局部窗口内图像块与在各个方向微小移动后的窗口内图像块的相似性。

    在像素点的邻域内,导数矩阵描述了数据信号的变化情况。假设在像素点邻域内任意方向上移动块区域,若强度发生了剧烈变化,则变化处的像素点为角点。定义2×2的Harris矩阵为:

    其中,Cx和Cy分别为点x=(x,y)在xx和y方向上的强度信息的一阶导数,ω(x,y)为对应位置的权重。通过计算Harris矩阵的角点响应值D来判断是否为角点。其计算公式为:

    其中,det和trace为行列式和迹的操作符,m是取值为0.04~0.06的常数。当角点响应值大于设置的门限,且为该点邻域内的局部最大值时,则把该点当作角点。

    3.2 FAST角点特征提取

    基于加速分割测试的FAST算法可以快速地提取出角点特征。该算法判断一个候选点p是否为角点,依据的是在一个像素点p为圆心,半径为3个像素的离散化Bresenllam圆周上,在给定阈值t的条件下,如果在圆周上有n个连续的像素灰度值大于I(p)+t或小于I(p)−t。

    针对于上面的定义,我们可以用快速的方法来完成检测,而不用把圆周上的所有点都比较一遍。首先比较上下左右四个点的像素值关系,至少要有3个点的像素灰度值大于I(p)+t或小于I(p)−t,则p为候选点,然后再进一步进行完整的判断。

    为了加快算法的检测速度,可以使用机器学习ID3贪心算法来构建决策树。这里需要说明的是,在2010年Elmar和Gregory等人提出了自适应通用加速分割检测(AGAST)算法,通过把FAST算法中ID3决策树改造为二叉树,并能够根据当前处理的图像信息动态且高效地分配决策树,提高了算法的运算速度。

    4. 二进制字符串特征描述子

    可以注意到在两种角点检测算法里,我们并没有像SIFT或SURF那样提到特征点的描述问题。事实上,特征点一旦检测出来,无论是斑点还是角点描述方法都是一样的,可以选用你认为最有效的特征描述子。

    特征描述是实现图像匹配与图像搜索必不可少的步骤。到目前为止,人们研究了各种各样的特征描述子,比较有代表性的就是浮点型特征描述子和二进帽字符串特征描述子。

    像SIFT与SURF算法里的,用梯度统计直方图来描述的描述子都属于浮点型特征描述子。但它们计算起来,算法复杂,效率较低,所以后来就出现了许多新型的特征描述算法,如BRIEF。后来很多二进制串描述子ORB,BRISK,FREAK等都是在它上面的基础上的改进。

    4.1 BRIEF算法

    BRJEF算法的主要思想是:在特征点周围邻域内选取若干个像素点对,通过对这些点对的灰度值比较,将比较的结果组合成一个二进制串字符串用来描述特征点。最后,使用汉明距离来计算在特征描述子是否匹配。

    BRIEF算法的详细描述可以参考:BRIEF特征描述子

    4.2 BRISK算法

    BRISK算法在特征点检测部分没有选用FAST特征点检测,而是选用了稳定性更强的AGAST算法。在特征描述子的构建中,BRISK算法通过利用简单的像素灰度值比较,进而得到一个级联的二进制比特串来描述每个特征点,这一点上原理与BRIEF是一致的。BRISK算法里采用了邻域采样模式,即以特征点为圆心,构建多个不同半径的离散化Bresenham同心圆,然后再每一个同心圆上获得具有相同间距的N个采样点。

    由于这种邻域采样模式在采样时会产生图像灰度混叠的影响,所以BRISK算法首先对图像进行了高斯平滑图像。并且使用的高斯函数标准差σi与各自同心圆上点间距成正比。

    假设在(N2)个采样点中任意选取一对采样点(pi,pj),其平滑后的灰度值分别为I(pi,σi)和I(pj,σj),则两点间的局部梯度为:

    假设把所有采样点对构成的集合记为A,则

    那么短距离采样点对构成的集合S以及长距离采样点构成的集合L分别为:

    其中,通常设置距离阈值为

    δmax=9.75δ,δmin=13.67δ,其中δ为特征点的尺度。

    由于长距离采样点对含有更多的特征点角度信息,且局部梯度相互抵消,所以可以在集合L中计算出特征点的特征模式方向为:

    然后将采样模式围绕特征点旋转角度α=arctan2(gy,gx),进而特征描述子具有了旋转不变性。

    最后,在旋转后的短距离采样点集合S内,对所有的特征点对(Piα,pjα)行像素灰度值比较,最终形成512比特的二进制字符串描述子。

    4.3 ORB算法

    ORB算法使用FAST进行特征点检测,然后用BREIF进行特征点的特征描述,但是我们知道BRIEF并没有特征点方向的概念,所以ORB在BRIEF基础上引入了方向的计算方法,并在点对的挑选上使用贪婪搜索算法,挑出了一些区分性强的点对用来描述二进制串。ORB算法的详细描述可以参考:ORB特征点检测。

    4.4 FREAK算法

    Fast Retina KeyPoint,即快速视网膜关键点。

    根据视网膜原理进行点对采样,中间密集一些,离中心越远越稀疏。并且由粗到精构建描述子,穷举贪婪搜索找相关性小的。42个感受野,一千对点的组合,找前512个即可。这512个分成4组,前128对相关性更小,可以代表粗的信息,后面越来越精。匹配的时候可以先看前16bytes,即代表精信息的部分,如果距离小于某个阈值,再继续,否则就不用往下看了。

    5. 应用之图像匹配

    图像匹配的研究目标是精确判断两幅图像之间的相似性。图像之间的相似性的定义又随着不同的应用需求而改变。例如,在物体检索系统中(找出含有亚伯拉罕·林肯的脸的图像),我们认为同一物体的不同图像是相近的。而在物体类别检索系统中(找出含有人脸的图像),我们则认为相同类的物体之间是相近的。

    这里局部特征点的应用主要表现在第一种相似性上,也就是说我们需要设计某种图像匹配算法来判断两幅图像是否是对同一物体或场景所成的图像。理想的图像匹配算法应该认为两幅同一物体的图像之间相似度很高,而两幅不同物体的图像之间相似度很低,如下图所示。

    由于成像时光照,环境,角度的不一致,我们获取的同一物体的图像是存在差异的,如同上图中的两辆小车的图像一样,角度不同,成像就不同。我们直接利用图像进行比较是无法进行判断小车是否为同一类的。必须进行特征点的提取,再对特征点进行匹配。

    图像会存在哪些变换呢?一般来说包括了光照变化与几何变化,光照变化表现是图像上是全局或局部颜色的变化,而几何变化种类就比较多了,可以是平移、旋转、尺度、仿射、投影变换等等。所以我们在研究局部特征点时才要求特征点对这些变化具有稳定性,同时要有很强的独特性,可以让图像与其他类的图像区分性强,即类内距离小而类间距离大。

    6. 参考文献

    [1] 基于角点的图像特征提取与匹配算法研究,薛金龙,2014.

    [2] 基于局部特征的图像匹配与识别,宫明明,2014.

    [3] 基于视觉信息的图像特征提取算法研究,戴金波,2014.

    [4] 图像局部不变性特征与描述,王永明,王贵锦编著。

    转载自:人工智能AI技术

    本文仅做学术分享,如有侵权,请联系删文。

    下载1

    在「3D视觉工坊」公众号后台回复:3D视觉即可下载 3D视觉相关资料干货,涉及相机标定、三维重建、立体视觉、SLAM、深度学习、点云后处理、多视图几何等方向。

    下载2

    在「3D视觉工坊」公众号后台回复:3D视觉github资源汇总即可下载包括结构光、标定源码、缺陷检测源码、深度估计与深度补全源码、点云处理相关源码、立体匹配源码、单目、双目3D检测、基于点云的3D检测、6D姿态估计源码汇总等。

    下载3

    在「3D视觉工坊」公众号后台回复:相机标定即可下载独家相机标定学习课件与视频网址;后台回复:立体匹配即可下载独家立体匹配学习课件与视频网址。

    重磅!3DCVer-学术论文写作投稿 交流群已成立

    扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

    同时也可申请加入我们的细分方向交流群,目前主要有3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、多传感器融合、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流、ORB-SLAM系列源码交流、深度估计等微信群。

    一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。

    ▲长按加微信群或投稿

    ▲长按关注公众号

    3D视觉从入门到精通知识星球:针对3D视觉领域的视频课程(三维重建系列三维点云系列结构光系列手眼标定相机标定orb-slam3等视频课程)、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近2000星球成员为创造更好的AI世界共同进步,知识星球入口:

    学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

     圈里有高质量教程资料、可答疑解惑、助你高效解决问题

    觉得有用,麻烦给个赞和在看~  

    展开全文
  • Harris检测算法对于图像的某些变化效果不是很好,比如旋转,尺寸变化甚至透视变换。本篇首先熟悉这些图像变换,然后再介绍目前的一些关键点检测算法。 提示:写完文章后,目录可以自动生成,如何生成可参考右边的...

    Camera系列文章

    传感器融合是将多个传感器采集的数据进行融合处理,以更好感知周围环境;这里首先介绍Camera的相关内容,包括摄像头及图像知识基本介绍,OpenCV图像识别(特征提取,目标分类等),融合激光点云和图像进行TTC估计。

    系列文章目录
    1. 摄像头基础及校准
    2. Lidar TTC估计
    3. Camera TTC估计
    4. OpenCV图像特征提取
    5. 常见特征检测算法介绍
    6. 常见特征描述符介绍
    7. YOLOv3物体检测



    Harris检测算法可以很好的检测角点,但对于图像的某些变化效果不是很好,比如旋转,尺寸变化甚至透视变换。本节首先熟悉这些图像变换,然后再介绍目前的一些关键点检测算法。

    亮度和几何变化不变性

    目前已经有很多特征检测算法(包括Harris检测算法)可以选择,根据需要检出的关键点类型和图像特性,需要考虑相关算法对亮度和几何变化的鲁棒性。
    下图是前后不同时刻帧的图像,可以看到存在比较严重的扭曲(变换)。在这里插入图片描述
    主要有四种变换类型需要考虑:

    1. 旋转 Rotation;
      在这里插入图片描述

    2. 尺寸变换 Scale change;
      在这里插入图片描述

    3. 强度变化 Intensity change;
      在这里插入图片描述

    4. 仿射变换 Affine transformation
      在这里插入图片描述

    自动尺寸选择

    为了在最佳尺寸下检出特征点,我们需要找出他们在图像中的大小,并选择适当的高斯窗 w ( x , y ) w(x,y) w(x,y)。如果无法获取特征点尺寸,就需要进行不同程度的尺寸变换。这里就需要关键点检测算法在不同尺寸进行关键点检测。目前大部分特征点检测算法可以自动选择特性尺度因子,很好的处理这个问题。
    在这里插入图片描述

    常用特征点检测算法介绍

    目前已经有很多的特征点检测算法用于物体识别,跟踪,图像匹配,机器人建图和3D建模等领域,除了具备以上图像变换的处理能力,还可以直接对比其检测性能和处理能力。
    Harris以及以下较为传统的检测算子,主要关注识别性能,计算复杂度相对次要以下。以下是这类算法:

    • Harris Corner Detector (Harris, Stephens),主要用于检测角点。
    • 1996 Good Features to Track (Shi, Tomasi)
    • 1999 Scale Invariant Feature Transform (Lowe),主要用于检测斑点(blob)
    • 2006 Speeded Up Robust Features (Bay, Tuytelaars, Van Gool),用于检测斑点,SIFT的优化版本;
      近些年有很多可运行于手机上的实时应用,以下是这类算法:
    • 2006 Features from Accelerated Segment Test (FAST) (Rosten, Drummond)
    • 2010 Binary Robust Independent Elementary Features (BRIEF) (Calonder, et al.)
    • 2011 Oriented FAST and Rotated BRIEF (ORB) (Rublee et al.)
    • 2011 Binary Robust Invariant Scalable Keypoints (BRISK) (Leutenegger, Chli, Siegwart)
    • 2012 Fast Retina Keypoint (FREAK) (Alahi, Ortiz, Vandergheynst)
    • 2012 KAZE (Alcantarilla, Bartoli, Davidson)

    以下我们将主要介绍Harris算法和Shi-Tomasi算法实现,代码如下(示例):

    void detKeypoints1()
    {
        // load image from file and convert to grayscale
        cv::Mat imgGray;
        cv::Mat img = cv::imread("../images/img1.png");
        cv::cvtColor(img, imgGray, cv::COLOR_BGR2GRAY);
    
        // Shi-Tomasi detector
        // prepare parameters
        int blockSize = 6;       //  size of a block for computing a derivative covariation matrix over each pixel neighborhood
        double maxOverlap = 0.0; // max. permissible overlap between two features in %
        double minDistance = (1.0 - maxOverlap) * blockSize;
        int maxCorners = img.rows * img.cols / max(1.0, minDistance); // max. num. of keypoints
        double qualityLevel = 0.01;                                   // minimal accepted quality of image corners
        double k = 0.04;
        bool useHarris = false;
    
        vector<cv::KeyPoint> kptsShiTomasi;
        vector<cv::Point2f> corners;  // output data structure
        double t = (double)cv::getTickCount();
        cv::goodFeaturesToTrack(imgGray, corners, maxCorners, qualityLevel, minDistance, cv::Mat(), blockSize, useHarris, k);
        t = ((double)cv::getTickCount() - t) / cv::getTickFrequency();
        cout << "Shi-Tomasi with n= " << corners.size() << " keypoints in " << 1000 * t / 1.0 << " ms" << endl;
    
        for (auto it = corners.begin(); it != corners.end(); ++it)
        { // add corners to result vector
    
            cv::KeyPoint newKeyPoint;
            newKeyPoint.pt = cv::Point2f((*it).x, (*it).y);
            newKeyPoint.size = blockSize;
            kptsShiTomasi.push_back(newKeyPoint);
        }
    
        // visualize results
        cv::Mat visImage = img.clone();
        cv::drawKeypoints(img, kptsShiTomasi, visImage, cv::Scalar::all(-1), cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
        string windowName = "Shi-Tomasi Results";
        cv::namedWindow(windowName, 1);
        imshow(windowName, visImage);
    
        // STUDENT CODE
        int threshold = 30;      // difference between intensity of the central pixel and pixels of a circle around this pixel
        bool bNMS = true;        // perform non-maxima suppression on keypoints
        cv::FastFeatureDetector::DetectorType type = cv::FastFeatureDetector::TYPE_9_16; // TYPE_9_16, TYPE_7_12, TYPE_5_8
        cv::Ptr<cv::FeatureDetector> detector = cv::FastFeatureDetector::create(threshold, bNMS, type);
    
        vector<cv::KeyPoint> kptsFAST;
        t = (double)cv::getTickCount();
        detector->detect(imgGray, kptsFAST);
        t = ((double)cv::getTickCount() - t) / cv::getTickFrequency();
        cout << "FAST with n= " << kptsFAST.size() << " keypoints in " << 1000 * t / 1.0 << " ms" << endl;
    
        visImage = img.clone();
        cv::drawKeypoints(img, kptsFAST, visImage, cv::Scalar::all(-1), cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
        windowName = "FAST Results";
        cv::namedWindow(windowName, 2);
        imshow(windowName, visImage);
        cv::waitKey(0);
    
        // EOF STUDENT CODE
    }
    
    展开全文
  • 1 引言随着互联网、物联网、传感器等技术的快速... 针对以上问题, 可以通过特征选择(Feature Selection)删除数据中无关、冗余的特征信息, 从而降低数据维度、噪音的干扰和算法的复杂度, 使模型变得简单且易于理解,...
  • 利用QR算法求解矩阵的特征值和特征向量为了求解一般矩阵(不是那种幼稚到shi的2 x 2矩阵)的特征值.根据定义的话,很可能需要求解高阶方程...这明显是个坑...高阶方程你肿么破...折腾了好久1.我要求特征值和...
  • SIFT(Scale Invariant Feature Transform)即尺度不变特征变换算法,该特征向量集具有对图像缩放,平移,旋转不变的特征。在对图片进行特征提取及匹配时,对于光照、仿射和投影变换也有一定的不变性,是一个鲁棒性...
  • 基于内容的推荐算法 Content-based Recommendations (CB) 根据推荐物品或内容的元数据,发现物品的相关性,再基于用户过去的喜好记录,为用户推荐相似的物品。 通过抽取物品内在或者外在的特征值,实现相似度计算...
  • 聚类算法特征降维-特征选择、主成分分析 1 降维 1.1 定义 【就是改变特征值,选择哪列保留,哪列删除;目标是得到一组“不相关”的主变量】 降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不...
  • 特征分析(Slow Feature Analysis,SFA)算法

    千次阅读 热门讨论 2021-07-27 10:38:18
    特征分析(Slow Feature Analysis,SFA) 内容较多且枯燥,建议耐心理解,放上冰冰降降温。 点击: 这里有相应的SFA算法的程序 可供参考。 1 Introduction 慢特征分析(Slow Feature Analysis,SFA),一种无监督...
  • 常见的特征提取算法主要分为以下3类:基于颜色特征:如颜色直方图、颜色集、颜色矩、颜色聚合向量等;基于纹理特征:如Tamura纹理特征、自回归纹理模型、Gabor变换、小波变换、MPEG7边缘直方图等;基于形状特征:如...
  • 基于matlab简单的特征脸的人脸识别程序这是小编写的程序,参照《模式识别》张学工第9章。 a1=imread('a1.jpg'); a2=imread('a2.jpg'); b1=imread('b1.jpg'); b2=imread('b2.jpg'); a1=rgb2gray(a1); a2=rgb2gray(a2)...
  • 一、基本概念在计算机科学中,分治法是一种很重要的算法。分治算法,字面上的解释是“分而治之”,分治算法主要是三点:1.将一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题----“分...
  • 文章目录维度的概念降维的目的:PCA 的信息衡量指标----可解释性方差降维过程简述降维算法与前面的特征选择算法的区别sklaern中的降维算法示例导入相关库提取特征和标签降维探索降维后的数据总结 维度的概念 对于...
  • 机器学习常见算法分类

    千次阅读 2021-02-03 19:32:43
    “机器学习是一门人工智能的科学,该领域的主要研究对象是人工智能,特别是如何在经验学习中改善具体算法的性能”。 “机器学习是对能通过经验自动改进的计算机算法的研究”。 “机器学习是用数据或以往的经验,...
  • 因此文中在分析随机森林算法的基本原理的基础上,提出一种改进的基于随机森林的特征筛选算法,并应用Python编程设计了一个能够预处理数据、调用这些算法、控制各参数并展现测试结果的系统,最终将该系统应用于肝癌...
  • 深度学习模型压缩算法综述(二):模型剪枝算法本文禁止转载联系作者:模型剪枝算法 :L1(L2)NormFilterPruner:主要思想:修剪策略:微调策略:残差网络的处理:缺点:FPGMNormFilterPruner:主要思想:基本原理:...
  • 文章目录一、第一种思路:平衡采样1.SMOTE算法二、第二种思路:使用新的指标   在训练二分类模型中,例如医疗诊断、网络入侵检测、信用卡反欺诈等,经常会遇到正负样本不均衡的问题。直接采用正负样本非常不均衡的...
  • 粒子群算法

    2021-01-22 17:25:28
    粒子群算法(1.初步了解) ​ 1995年,受鸟类捕食行为的启发,Kennedy和Eberhart正式提出了粒子群优化算法的概念。研究中发现,在鸟类捕食过程中,个体并不知道如何找到食物以及自身离食物到底有多远,为了找到食物,最...
  • 路径规划算法

    2021-11-14 10:20:44
    文章目录前言一、传统路径规划算法1.Dijkstra算法2.A*算法3.D*算法4.人工势场法二、基于采样路径规划算法1.PRM算法2.RRT算法三、智能仿生算法1.神经网络算法2.蚁群算法3.遗传算法 前言 随着机器人技术、智能控制...
  • 算法推荐服务提供者应当向用户提供不针对其个人特征的选项,或者向用户提供便捷的关闭算法推荐服务的选项。用户选择关闭算法推荐服务的,算法推荐服务提供者应当立即停止提供相关服务。 算法推荐服务提供者应当向...
  • 人工智能算法:遗传算法

    万次阅读 多人点赞 2021-01-21 19:33:15
    此外,可以将可选特征添加到遗传算法中,以增强其性能。例如物种形成、精英和其他选择方法之类的技术,有时可以改善遗传算法的运行效果。 3.1 离散问题的遗传算法 与其他算法相似,针对连续学习和离散学习,遗传...
  • 中心性算法 (Centrality Algorithms)

    千次阅读 2021-03-15 17:34:21
    中心性(Centrality)是社交网络分析(Social network analysis, SNA)中用以衡量网络中一个点或者一个人在整个网络中接近中心程度的一个概念,...中心性算法主要用于识别图中特定节点的角色及其对网络的影响。对于节点
  • 数据结构与算法必知基础知识

    千次阅读 多人点赞 2021-01-06 22:58:12
    文章已收录在 全网都在关注的数据结构与算法学习仓库 欢迎star 前言 数据结构与算法是程序员内功体现的重要标准之一,且数据结构也应用在各个方面,业界更有程序=数据结构+算法这个等式存在。各个中间件开发者,...
  • 贪心算法问题

    千次阅读 2020-12-22 00:09:21
    贪心算法的适用的问题贪心算法适用的问题必须满足两个属性:(1) 贪心性质:整体的最优解可通过一系列局部最优解达到,并且每次的选择可以依赖以前做出的选择,但不能依赖于以后的选择。(2) 最优子结构:问题的整体...
  • 文章目录KNN(K nearest neighbors)K值的选择和影响k取值偏小k取值偏大样本点距离的计算方式闵可夫斯基距离曼哈顿距离欧几里得距离切比雪夫距离...决策函数的选择用于分类的多票表决法用于回归的平均值法KNN算法的优缺点...
  • ORB算法

    千次阅读 2021-11-29 16:36:11
    ORB采用BRIEF算法来计算一个特征点的描述子。BRIEF算法的核心思想是在关键点P的周围以一定模式选取N个点对,把这N个点对的比较结果组合起来作为描述子。” 接下来看一下具体操作: 1)以关键点P为圆心,以d为半径做...
  • 二叉树的后序遍历post order算法 决策树 信息、熵以及信息增益的概念 决策树构造例子 可视化 CART 随机森林 深度优先搜索的节点 dfs:Depth First Search,深度优先搜索 我们在做dfs的时候,当访问到一个...
  • 前言 双目立体匹配的原理类似于人类的视觉原理:...双目立体视觉一般是指使用两个摄像机从不同的角度获取同一个场景的左右视图,然后使用双目立体匹配算法来寻找左右视图中的匹配像素点对,最后利用三角测量原理来还
  • 目录贪心算法贪心算法优化问题贪心算法概述贪心算法的基本要素贪心选择性质最优子结构贪心法的步骤贪心法的主要特点贪心法的正确性证明贪心算法问题举例活动安排问题问题描述算法描述代码算法正确性的证明复杂度01...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 307,499
精华内容 122,999
关键字:

哪个不是算法的特征