我发现了几个与此相关的问题,但没有人解答我的疑问。
尤其是,这两个问题的答案更让我困惑。
我在一组特征之上训练一个线性支持向量机——由图像产生的卷积神经网络特征。例如,我有一个3500x4096X矩阵,和往常一样,它的行和列上的功能都有示例。
我想知道在给SVM输入之前如何正确地标准化/规范化这个矩阵。我看到两种方法(使用sklearn):
标准化功能。其结果是具有0平均值和单一标准的特征。
X = sklearn.preprocessing.scale(X)
X = sklearn.preprocessing.normalize(X, axis=0)
最佳答案
您应该根据对数据有意义的内容选择缩放方案。There are different ways of scaling,您将使用哪一个取决于数据。每个方案都将不同功能的值带入可比较的范围,但每个方案都会保留不同类型的信息(并歪曲其他信息)。尽管有合理的解释来解释为什么某些缩放方案更适合特定的情况,但是仅仅尝试这些不同的方案(如标准缩放和标准化)并使用效果更好的方案(只要您通过validaTE或其他方式确保您的性能测量是通用的和准确的)。
StandardScaler
这就是sklearn.preprocessing.scale(X)所使用的。它假定您的特征是正态分布的(每个特征具有不同的平均值和标准偏差),并对它们进行缩放,使每个特征的高斯分布现在集中在0左右,标准偏差为1。
它通过计算每个功能的平均值和stdev来实现这一点,然后将该功能的每个实际值转换为一个z-score:该值与平均值相差多少stdev?z=(平均值)/stdev
这通常很有效,但如果正态性假设完全错误,那么这可能不是您的最佳缩放方案。实际上,在许多情况下,正态性假设不成立,但是分布比较接近,这个方案仍然可以很好地工作。然而,如果数据完全远离正态性,例如高度偏斜的肥尾分布(如幂律),该方案将不会给出好的结果。
Normalizer
这就是sklearn.preprocessing.normalize(X, axis=0)所使用的。它以向量的形式查看给定数据点的所有特征值,并将该向量除以其大小来规范化。例如,假设您有3个特性。特定点的值为[x1, x2, x3]。如果使用默认的'l2'规范化,则将每个值除以sqrt(x1^2 + x2^2 + x3^2)。如果您使用的是'l1'标准化,则将每个值除以x1+x2+x3。这可以确保每个特征的值在相似的范围内,因为每个特征向量都是单位向量。如果一个点的特征值很大,那么幅度也很大,您可以除以一个大数字。如果它们很小,你就用一个小数字把它们分开。
理由是你可以把你的数据看作是N维空间中的点,其中N是特征的数量。每个特征都是一个轴。标准化将每个点拉回到原点,使其距离原点只有1个单位。基本上,你把空间压缩成单位超立方体。每个点(从原点到数据点)的向量之间的角度保持不变。
这在文本数据中使用得非常多,因为它有很多直观的意义:如果每个功能都是不同单词的计数,'l1'标准化基本上将这些计数转换为频率(您除以单词总数)。这是有道理的。如果使用“归一化”,则当对两个向量进行归一化时,两个向量之间的角度(这称为余弦距离或相似性)将保持不变,并且此距离更接近意义距离,因为它对应于单词之间的频率比,并且不受l的影响。每个向量所代表的文本的长度。
如果保存点之间的余弦距离类型的关系对您的数据更有意义,或者如果归一化对应于自然缩放(例如采用频率而不是计数),那么这个更合适。
MinMaxScaler
您可以像使用'l2'一样使用它。对于每个功能,这将查看最小值和最大值。这是此功能的范围。然后它收缩或拉伸每个特征的范围(默认值为0到1)。
它通过将每个值转换为sklearn.preprocessing.MinMaxScaler().fit_transform(X)来实现这一点。它基本上是在什么范围内,我在说谎?请记住,范围仅由功能的最小值和最大值确定。尽管如此,所有的值可能都在10、11左右,还有一个单独的异常值900。没关系,你的射程是10到900。您可以看到,在某些情况下,这是可取的,而在其他情况下,这将是有问题的,取决于具体的问题和数据。
这种方案在某些情况下工作得更好,在这些情况下,标准缩放器可能无法正常工作。例如,如果特征的标准偏差非常小,那么Standardscaler对不同特征的标准偏差之间的微小变化非常敏感,但是MinMaxscaler非常健壮。另外,对于具有高度倾斜分布的特性,或者每个特性都有很多零的稀疏情况下,将分布从高斯移走,minmaxscaler是一个更好的选择。
关于python - 用于规范化sklearn SVM输入的正确功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30918781/
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参
我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:
我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co
只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您
我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent
当我使用has_one时,它工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290