1. 关于特征提取

0x1:什么是特征提取

特征提取研究的主要问题是,如何在数据集未明确表示结果的前提下,从中提取出重要的潜在特征来。和无监督聚类一样,特征提取算法的目的不是为了预测,而是要尝试对数据进行特征识别,以此得到隐藏在数据背后的深层次意义。

回想一下聚类算法的基本概念,聚类算法将数据集中的每一行数据分别分配给了某个组(group)或某个点(point),每一项数据都精确对应于一个组,这个组代表了组内成员的平均水平

特征提取是这种聚类思想更为一般的表现形式,它会尝试从数据集中寻找新的数据行,将这些新找到的数据行加以组合,就可以重新构造出数据集。和原始数据集不一样,位于新数据集中的每一行数据并不属于某个聚类,而是由若干特征的组合构造而成的。

从特征提取的这个原理来看,特征提取也可以理解为一种泛化的降维概念

在这篇文章中,笔者会尝试从底层的数学原理出发,阐述这些概念之间的联系和区别。其实不论是特征提取、降维、聚类,都只是从不用的角度解决同一类问题,其背后的原理都是共通的。

0x2:独立特征提取的典型应用场景

1. 鸡尾酒宴会问题

这是一个如何在多人谈话时鉴别声音。人类听觉系统的一个显著特征就是:在一个人声鼎沸屋子里,尽管有许多不同的声音混杂在一起涌入我们的耳朵,可我们还是能够从中鉴别出某个声音来,大脑非常擅长于从听到的所有噪声中分离出单独的声音。

同样的目标,通过本文将要讨论的独立特征提取技术,计算机就有可能完成同样的任务。

2. 新闻主题分类

独立特征提取的一个重要应用是,对重复出现于一组文档中的单词使用组合进行模式识别(word-usage pattern recognition),这可以帮助我们有效地识别出,以不同组合形式出现于各个文档中的主题。从文档中提取出的这些主题,就可以作为一个泛化的一般化特征,用于概括一整类文旦。同时,通过对文档进行独立特征识别,我们会发现,一篇文章可以包含不止一个主题,同时,同一个主题也可以用于不止一篇文章。

例如,对于某个重大新闻,往往会有多家报社从不同角度都进行了报道,虽然各家报社的侧重点各有不同,但是不可避免会有一些公共主题是交叉的。具体来说,例如美国大选特朗普当选总统,CNN和纽约时报都进行了报道,两家报纸的侧重点各有不同,但是都不约而同地谈到了特朗普过去的从商经历等。

需要特别注意的是,必须要保证要搜索的文档中存在内容重叠的主题(acrossover topic),如果没有任何文档存在共同之处,那么算法将很难从中提取出重要的通用特征,如果强行提取则最终得到的特征将会变得毫无意义(这也体现了独立特征提取技术的降维和聚类本质)。

3. 股票市场数据分析

股票市场是一个集体智慧共同作用的典型场景,在股市经济活动中,每一个自然人都遵循最大收益原则开展活动(凯恩斯的开不见的手宏观经济理论),通俗地说就是,每个投资者做每项投资的目的都是为了使自己的收益最大化。整个社会千千万万个投资者共同形成了一个股票市场。

基于这个前提下,我们假设股票市场数据背后潜藏着诸多原因,正是这些原因共同组成的结果,导致了证券市场的结果。我们可以将独立特征提取算法应用于这些数据,寻找数据背后的原因,以及它们各自对结果所构成的影响。

独立特征提取技术可以用来对股市的成交量进行分析。所谓成交量,就是指在某一给定时间段内所买卖的股票份数,下图是Yahoo!股票的走势图,

位于最上方的线代表了收盘价,下面的柱状图则给出了成交量。

我们发现,当股票价格有较大变化时,成交量在那几天往往就会变得很高。这通常会发生在公司发表重要声明或发布财务报告的时候。此外,当有涉及公司或业界新闻报道时,也会导致价格出现”突变“。在缺少外部事件影响的情况下,对于某只股票而言,成交量通常(但不总是)保持不变的。

从成交量中提取出的独立特征,基本上就是明面上或者背后的某些”利好“或”不好“事件。

Relevant Link:

《集体智慧编程》Toby segaran - 第10章

2. 非负矩阵因式分解(non-negative matrix factorization,NMF)

0x1:以文章矩阵为例简要说明NMF

NMF是一个非常数学化的概念,我们本章会详细讨论其底层数学原理,不过,笔者希望通过一个简单易懂的例子来为读者朋友先建立一个感性的直观概念,为之后的原理讨论作铺垫。

假设我们现在通过词频语言模型,已经将一个文档集(很多篇文章)转换为了一个【M,N】矩阵,M代表有M篇文章,N代表有N个词,元素的数值代表该单词在对应文章中的词频计数。

我们的目标是要对着个矩阵进行因式分解,即,找到两个更小的矩阵,使得二者相乘以得到原来的矩阵。这两个矩阵分别是特征矩阵权重矩阵

【特征矩阵】

在该矩阵中,每个特征对应一行,每个单词对应一列。矩阵中的数字代表了某个单词相对于某个特征的重要程度。

由于每个特征都应该对应于在一组文章中出现的某个主题,因此假如有一篇文章报道了一个新的电视秀节目,那么也许我们会期望这篇文章相对于单词”television“能够有一个较高的权重值。

一个特征矩阵示例

由于矩阵中的每一行都对应于一个由若干单词联合组成的特征,因此很显然,只要将不同数量的特征矩阵按行组合起来,就有可能重新构造出文章矩阵来。

而如何组合不同的特征矩阵,用多少特征矩阵来组合,就是由权重矩阵来控制。

【权重矩阵】

该矩阵的作用是,将特征映射到文章矩阵,其中每一行对应于一篇文章每一列对应于一个特征。矩阵中的数字代表了每个特征应用于每篇文章的程度。

一个权重矩阵示例

下图给出了一个文章矩阵的重构过程,只要将权重矩阵与特征矩阵相乘,就可以重构出文章矩阵,

遵照矩阵乘法法则,特征矩阵的行数和权重矩阵的列数必须要相等。如果特征数量与文章数量恰好相等,那么最理想的结果就是能够为每一篇文章都找到一个与之完美匹配的特征。

在独立特征提取领域中,使用矩阵因式分解的面对,是为了缩减观测数据(例如文章)的集合规模,并且保证缩减之后足以反映某些共性特征。理想情况下,这个较小的特征集能够与不同的权重值相结合,从而完美地重新构造出原始的数据集。但实际情况中,这种可能性是非常小的,因此算法的目标是要尽可能地重新构造出原始数据集来。

笔者思考

笔者这里带领大家用形象化的思维来理解一下矩阵因式分解,我们将其想象为我们吃月饼,从中间将其掰开为两半,一半是特征矩阵,一半是权重矩阵。特征矩阵和权重矩阵原本都不存在,因为我们一掰,凭空出现了2个小的月饼。那接下来的问题来了,我们能否随意的掰这个月饼呢?答案是不行!这个月饼有自己的法则,只允许我们按照有限几种方案来掰,因为该法则要求掰开后的两半还必须能够完美的拼回一个完整的月饼。

回到矩阵因式分解上来,矩阵的因式分解类似于大数的质因分解,一个矩阵只存在少量几种因式分解方法。而要找到这几种分解方案,就需要使用一些非常精巧的算法,例如本文要介绍的乘法更新法则(multiplicative update rules)

0x2:乘法更新法则(multiplicative update rules)- 寻找矩阵因式分解的一种算法

我们的目标很明确,希望找到两个矩阵(满足M和N的约束即可),这两个矩阵相乘要尽可能接近原始目标矩阵,我们也建立了损失函数difcost,通过计算最佳的特征矩阵和权重矩阵,算法尝试尽最大可能来重新构造文章矩阵。我们通过difcost函数来度量最终的结果与理想结果的接近程度。

一种可行的优化方法是将其看作是一个优化问题,借助模拟退火或者遗传算法搜索到一个满意的题解,但是这么做的搜索成本可能过于庞大(随着原始矩阵尺寸的上升),一个更为有效的方法是,使用乘法更新法则(multiplicative update rules)。

这些法则产生了4个更新矩阵(update matrices),这里我们将最初的文章矩阵称为数据矩阵。

  • hn:经转置后的权重矩阵与数据矩阵相乘得到的矩阵
  • hd:经转置后的权重矩阵与原权重矩阵相乘,再与特征矩阵相乘得到的矩阵
  • wn:数据矩阵与经转置后的特征矩阵相乘得到的矩阵
  • wd:权重矩阵与特征矩阵相乘,再与经转置后的特征矩阵相乘得到的矩阵

为了更新特征矩阵和权重矩阵,算法需要做如下几个操作,

  • 首先将上述所有矩阵都转换成数组
  • 然后将特征矩阵中的每一个值域hn中的对应值相乘,并除以hd中的对应值
  • 再将权重矩阵中的每一个值域wn中的对应值相乘,并除以wd中的对应值
from numpy import *
import numpy as np def difcost(a,b):
dif=
for i in range(shape(a)[]):
for j in range(shape(a)[]):
# Euclidean Distance
dif+=pow(a[i,j]-b[i,j],)
return dif def factorize(v,pc=,iter=):
ic=shape(v)[]
fc=shape(v)[] # Initialize the weight and feature matrices with random values
w=matrix([[random.random() for j in range(pc)] for i in range(ic)])
h=matrix([[random.random() for i in range(fc)] for i in range(pc)]) # Perform operation a maximum of iter times
for i in range(iter):
wh=w*h # Calculate the current difference
cost=difcost(v,wh) if i%==: print cost # Terminate if the matrix has been fully factorized
if cost==: break # Update feature matrix
hn=(transpose(w)*v)
hd=(transpose(w)*w*h) h=matrix(array(h)*array(hn)/array(hd)) # Update weights matrix
wn=(v*transpose(h))
wd=(w*h*transpose(h)) w=matrix(array(w)*array(wn)/array(wd)) return w,h if __name__ == '__main__':
l1 = [[,,], [,,]]
m1 = matrix(l1)
m2 = matrix([[,], [,], [,]])
print "np.shape(m1*m2): ", np.shape(m1*m2)
w, h = factorize(m1*m2, pc=, iter=)
print "w: ", w
print "h: ", h print "w*h: ", w*h
print "m1*m2: ", m1*m2

可以看到,算法成功地找到了权重矩阵和特征矩阵,使得这两个矩阵相乘的结果与原始矩阵几乎完美匹配。

值得注意的是,MUR方法要求我们明确指定希望找到的特征数。例如,在一段录音中的两个声音,或者是当天的5大新闻主题。

0x3:理论概述

1. 算法形式化描述

有了前两节的铺垫,现在我们来讨论一些NMF的理论概念。

NMF(Non-negative matrix factorization),即对于任意给定的一个非负矩阵V,其能够寻找到一个非负矩阵W和一个非负矩阵H,满足条件V=W*H。从而将一个非负的矩阵分解为左右两个非负矩阵的乘积。其中,

  • V矩阵中每一列代表一个观测(observation),每一行代表一个特征(feature)
  • W矩阵称为基矩阵,即特征矩阵
  • H矩阵称为系数矩阵或权重矩阵,这时用系数矩阵H代替原始矩阵,就可以实现对原始矩阵进行降维,得到数据特征的降维矩阵,从而减少存储空间(从【M*N】降到【M*K】维)

分解过程如下图所示,

2. 损失函数形式

对于如何衡量因式分解的效果,有3种损失函数形式,其中第一种我们上前面的例子中已经使用到了简化版本。

【squared frobenius norm】

其中:

α为L1&L2正则化参数,

浅谈独立特征(independent features)、潜在特征(underlying features)提取、以及它们在网络安全中的应用的更多相关文章

  1. 浅谈范德蒙德(Vandermonde)方阵的逆矩阵的求法以及快速傅里叶变换(FFT)中IDFT的原理

    浅谈范德蒙德(Vandermonde)方阵的逆矩阵与拉格朗日(Lagrange)插值的关系以及快速傅里叶变换(FFT)中IDFT的原理 标签: 行列式 矩阵 线性代数 FFT 拉格朗日插值 只要稍微看 ...

  2. 浅谈独立使用NDK编译库文件(Android)

    阅读前准备 这是一篇相对入门的文章.文中会涉及到少许NDK的知识,但个人认为对初学者来说都相对比较实用,因为都是在平时项目中遇到的(目前自己也是初学者).一些其他高深的技术不再本文探讨范围之内(因为我 ...

  3. 【转】浅谈自动特征构造工具Featuretools

    转自https://www.cnblogs.com/dogecheng/p/12659605.html 简介 特征工程在机器学习中具有重要意义,但是通过手动创造特征是一个缓慢且艰巨的过程.Python ...

  4. 浅谈自动特征构造工具Featuretools

    简介 特征工程在机器学习中具有重要意义,但是通过手动创造特征是一个缓慢且艰巨的过程.Python的特征工程库featuretools可以帮助我们简化这一过程.Featuretools是执行自动化特征工 ...

  5. 浅谈线程池(中):独立线程池的作用及IO线程池

    原文地址:http://blog.zhaojie.me/2009/07/thread-pool-2-dedicate-pool-and-io-pool.html 在上一篇文章中,我们简单讨论了线程池的 ...

  6. 浅谈Feature Scaling

    浅谈Feature Scaling 定义:Feature scaling is a method used to standardize the range of independent variab ...

  7. 浅谈用ModelSim+Synplify+Quartus来实现Altera FPGA的仿真

    浅谈用ModelSim+Synplify+Quartus来实现Altera FPGA的仿真 工作内容: Mentor公司的ModelSim是业界最优秀的HDL语言仿真软件,它能提供友好的仿真环境,是业 ...

  8. 浅谈如何检查Linux中开放端口列表

    给大家分享一篇关于如何检查Linux中的开放端口列表的详细介绍,首先如果你想检查远程Linux系统上的端口是否打开请点击链接浏览.如果你想检查多个远程Linux系统上的端口是否打开请点击链接浏览.如果 ...

  9. C#核心基础--浅谈类和对象的概念

    浅谈类和对象的概念 一.什么是类?什么是对象? 学习一门面向对象编程语言,我们必须得知道什么是类?什么是对象? 类(Class)实际上是对某种类型的对象定义变量和方法的原型.它表示对现实生活中一类具有 ...

随机推荐

  1. java swing 开发 -JTable

    最近利用空闲时间自己琢磨了一下java swing 编程,其实在从事javaweb之前我一直向往的就是java swing 开发,不知道为什么可能当时觉得Windows上的exe程序很是神奇,关于wi ...

  2. 【POJ - 2139】Six Degrees of Cowvin Bacon (Floyd算法求最短路)

    Six Degrees of Cowvin Bacon Descriptions 数学课上,WNJXYK忽然发现人缘也是可以被量化的,我们用一个人到其他所有人的平均距离来量化计算. 在这里定义人与人的 ...

  3. 002——Netty之Netty介绍

    Netty出现背景 Java NIO难用 据说存在bug 业界其他NIO框架不成熟 Netty主要解决两个相应关注领域 (1)异步和事件驱动的实现. (2)一组设计模式,将应用逻辑与网络层解耦. 特性 ...

  4. 7.4 元组tuple类型内置方法

    元组tuple 元组相当于不可变的列表,在定义完成后后面就不可以进行更改,因此元组只可取不可存 因为不可变,所以相对列表来说,他的功能也少了很多,所以,不难理解,他有个优点就是占用内存小. 作用:能够 ...

  5. mysql 输入show databases 没反应

    我是小白,大佬勿喷 *** mysql 输入show databases 没反应 一句话 不要忘记使用MySQL时在命令后加;哦 * * * 在Linux输入以下命令 mysql 终端显示以下文本 W ...

  6. 基于Springboot的BaseService和BaseController

    基于Springboot的BaseService,BaseController 前言: 在做项目时需要对大量的表做增删查改,而其中的逻辑大同小异,所以抽象了一个 BaseService,BaseCon ...

  7. element-ui表单验证无效解决

    最近在项目中遇到了一个需求,需要动态增减表单元素,同时给新增的表单元素增加校验规则. element-ui官网给出了解决方案:点击新增按钮时,向循环渲染的数组中push新的对象,数据驱动视图,通过增加 ...

  8. MUI-页面传参数

    点击第一个页面的标签,跳转到第二个页面,把第一个页面的值也传往目标页面 现在提供两种实现方式 注意:需要在手机运行才可以,用电脑浏览器可能不支持. 第一种方式  页面已创建,通过自定义事件传值 fir ...

  9. python 实现多个线程间消息队列传递,一个简单的列子

    #-*-coding:utf8-*-"""Producer and consumer models: 1. There are many producers and co ...

  10. react antd 关于selectedRows 的问题

    在table中,经常会用到单选和多选的功.这里会有一个方法, 当触发onchange的时候回有两个数组,[selectedRowKeys, selectedRows],当前选中的keys和每一项, 这 ...