在Python卷积hypercolumns

如果你是以下一些机器学习的消息,你肯定看到了瑞恩·达尔所做的工作自动彩色化黑客新闻评论reddit的评论)。这个惊人的工作是采用像素超柱状体从VGG-16网络,以便提取上色图像的信息。Samim还利用网络对黑白视频帧进行了处理,制作了以下令人惊叹的视频:

https://www.youtube.com/watch?v=_MJU8VK2PI4

着色黑白电影与神经网络(由SAMIM视频,网络由Ryan)

但如何做到这一点hypercolumns作品?如何提取他们在这样的各种像素的分类问题使用?这篇文章的主要思想是使用具有Keras和Scikit-学习VGG-16预训练的网络一起,以提取像素hypercolumns并采取目前其上的信息的肤浅的样子。我写这篇文章,因为我还没有发现在Python什么做到这一点,这可能是别人对像素分类,分割等工作真的很有用

Hypercolumns

许多使用CNNs(卷积神经网络)特征的算法通常使用FC(全连接)层特征来提取特定输入的信息。然而,最后一层FC层中的信息在空间上可能过于粗糙,无法实现精确的定位(由于maxpooling序列等),另一方面,第一层可能在空间上是精确的,但将缺乏语义信息。为了两全其美,the的作者hypercolumn纸定义“上方”该像素的像素,因为所有的CNN单元的激活矢量的hypercolumn。

Hypercolumn提取
Hypercolumn提取通过Hypercolumns为对象分割和细粒度本地化

在hypercolumns的提取的第一步是将图像馈送到CNN(卷积神经网络)并提取特征图激活针对图像的每个位置。最棘手的部分是,当特征地图比输入图像更小,例如一个池操作之后,该论文的作者,然后做特征映射的双线性采样,以保持特征地图上输入相同的大小。还有与对FC的issue(完全连接)层,因为你不能隔离在语义上仅绑定到图像的一个像素的单位,所以FC激活被视为1×1的特征地图,这意味着所有位置共享关于超列的FC部分的相同信息。然后,将所有这些激活连接起来,创建超列。例如,如果我们在vga -16架构中只使用最大池操作后的前2个卷积层,我们将得到一个超列,其大小为:

64个过滤器池之前第一CONV层

+

128过滤器池之前第二CONV层)=192的特性

这意味着图像的每个像素将具有192维向量hypercolumn。这hypercolumn真的很有趣,因为它包含关于第一层(在这里我们有很多的空间信息,但很少语义)关于最后几层,也信息(很少的空间信息和大量的语义的)信息。因此,本hypercolumn将大量的像素分类任务一定的帮助,如一个较早的自动着色的提及,因为每个位置hypercolumn携带什么这个像素语义上和空间上代表的信息。这也是上分割任务非常有帮助亚洲金博宝的(你可以看到更多有关原始文件介绍hypercolumn概念)。

一亚洲金博宝切听起来很酷,但我们如何在实践中提取hypercolumns?

VGG-16

Before being able to extract the hypercolumns, we’ll setup the VGG-16 pre-trained network, because you know, the price of a good GPU (I can’t even imagine many of them) here in Brazil is very expensive and I don’t want to sell my kidney to buy a GPU.

VGG16网络架构(由志成燕等人。)
VGG16网络架构(由志成燕等人。)

要设置上Keras预训练VGG-16网络,你需要下载文件的权重从这里(具有大约500MB vgg16_weights.h5文件),然后设置的体系结构和加载使用Keras下载的权重(关于权重文件和体系结构的更多信息这里):

从matplotlib进口pyplot如PLT进口theano进口CV2进口numpy的为NP进口SciPy的从keras.models SP导入顺序从keras.layers.core进口展平,密,差从keras.layers.convolutional进口Convolution2D,MaxPooling2D从keras.layers。Convolutional import ZeroPadding2D from keras.optimizers import SGD from sklearn.manifold import TSNE from sklearn import manifold from sklearn import cluster from sklearn.preprocessing import StandardScaler def VGG_16(weights_path=None): model = Sequential() model.add(ZeroPadding2D((1,1),input_shape=(3,224,224))) model.add(Convolution2D(64, 3, 3, activation='relu')) model.add(ZeroPadding2D((1,1))) model.add(Convolution2D(64, 3, 3, activation='relu')) model.add(MaxPooling2D((2,2), stride=(2,2))) model.add(ZeroPadding2D((1,1))) model.add(Convolution2D(128, 3, 3, activation='relu')) model.add(ZeroPadding2D((1,1))) model.add(Convolution2D(128, 3, 3, activation='relu')) model.add(MaxPooling2D((2,2), stride=(2,2))) model.add(ZeroPadding2D((1,1))) model.add(Convolution2D(256, 3, 3, activation='relu')) model.add(ZeroPadding2D((1,1))) model.add(Convolution2D(256, 3, 3, activation='relu')) model.add(ZeroPadding2D((1,1))) model.add(Convolution2D(256, 3, 3, activation='relu')) model.add(MaxPooling2D((2,2), stride=(2,2))) model.add(ZeroPadding2D((1,1))) model.add(Convolution2D(512, 3, 3, activation='relu')) model.add(ZeroPadding2D((1,1))) model.add(Convolution2D(512, 3, 3, activation='relu')) model.add(ZeroPadding2D((1,1))) model.add(Convolution2D(512, 3, 3, activation='relu')) model.add(MaxPooling2D((2,2), stride=(2,2))) model.add(ZeroPadding2D((1,1))) model.add(Convolution2D(512, 3, 3, activation='relu')) model.add(ZeroPadding2D((1,1))) model.add(Convolution2D(512, 3, 3, activation='relu')) model.add(ZeroPadding2D((1,1))) model.add(Convolution2D(512, 3, 3, activation='relu')) model.add(MaxPooling2D((2,2), stride=(2,2))) model.add(Flatten()) model.add(Dense(4096, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(4096, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(1000, activation='softmax')) if weights_path: model.load_weights(weights_path) return model

正如你所看到的,这是一个非常简单的代码(与Pytho亚洲金博宝n进口所需要的包一起)申报VGG16架构并加载预训练的权重。在此之后,我们将编译Keras模型:

模型= VGG_16('vgg16_weights.h5') sgd =sgd (lr=0.1,衰减=1e-6,动量=0.9,nesterov=True)

现在,让我们来测试使用图像网络:

im_original = cv2.resize(cv2.imread( 'madruga.jpg'),(224,224))IM = im_original.transpose((2,0,1))IM = np.expand_dims(1M,轴= 0)im_converted= cv2.cvtColor(im_original,cv2.COLOR_BGR2RGB)plt.imshow(im_converted)

图片使用

图片使用

如我们所见,我们加载了图像,固定了轴,然后我们现在可以把图像输入到vgg16得到预测:

OUT = model.predict(IM)plt.plot(out.ravel())

预测
预测

正如您所看到的,这些是softmax层的最终激活,带有“jersey, t恤,t恤”类别的类。

提取任意特征图

现在,提取特征地图的激活,我们必须能够提取特征从网络的任意卷积层映射。我们可以通过使用编译Theano功能做到这一点get_output ()Keras的方法,如在下面的例子:

get_feature = theano.function ([model.layers [0]。get_output(train=False), allow_input_downcast=False) feat = get_feature(im) pt .imshow(feat[0][2])

特征映射

特征映射

在上面的例子中,我编译Theano函数来获取3层(卷积层)的特征图,然后仅示出第三特征地图。在这里我们可以看到激活的强度。如果我们从功能,最终层激活的地图上,我们可以看到,提取的特征是比较抽象的,一样的眼睛,等看从15卷积层下面这个例子:

get_feature = theano.function([model.layers [0]。输入],model.layers [15] .get_output(列车= FALSE),allow_input_downcast =假)技艺= get_feature(IM)plt.imshow(技艺[0] [13])

更多语义特征图

更多的语义特征映射。

正如你所看到的,这第二个特征图提取更抽象的特点。而且你还可以注意到,当我们前面看到的功能相比,形象似乎更加捉襟见肘,这是因为第一个特征映射具有224×224大小,这其中有56×56,由于各层的缩小操作卷积层之前,这就是为什么我们失去了很多的空间信息。

提取超柱状体

现在,终于让我们提取层的任意一组的hypercolumns。要做到这一点,我们将定义一个函数来提取这些hypercolumns:

DEF extract_hypercolumn(型号,layer_indexes,实例):层= [model.layers [LI] .get_output(列车=假),用于在layer_indexes LI] get_feature = theano.function([model.layers [0]。输入],层allow_input_downcast =假)feature_maps = get_feature(实例)hypercolumns = []用于feature_maps convmap:用于convmap FMAP [0]:=放大的sp.misc.imresize(FMAP,大小=(224,224),模式= “F”,口译= '双线性')hypercolumns.append(放大的)返回np.asarray(hypercolumns)

正如我们看到的,这个函数需要三个参数:模型本身、用于提取超列特性的层索引列表和用于提取超列的图像实例。现在让我们测试前2个卷积层的超列提取:

layers_extract = [3,8] hc = extract_hypercolumn(model, layers_extract, im)

就这样,我们提取的每个像素的hypercolumn载体。这个“HC”可变的形状是:(192L,224L,224L),这意味着我们为224×224像素中的每一个(总共50176个像素与每个192 hypercolumn功能)192维hypercolumn。

让我们画出每个像素的超列激活的平均值:

ave = np.average (hc。Ťranspose(1, 2, 0), axis=2) plt.imshow(ave)
Hypercolumn平均层3和8。
Hypercolumn平均层3和8。

你可以看到,那些第一个超列激活看起来都像边缘检测器,让我们看看这些超列是如何为第22层和第29层:

layers_extract = [22,29] HC = extract_hypercolumn(模型,layers_extract,1M)平均= np.average(hc.transpose(1,2,0),轴= 2)plt.imshow(AVE)
层22和29的超列平均。
层22和29的超列平均。

正如我们现在看到的,这些特征实际上更抽象,语义上更有趣,但是空间信息有点模糊。

请记住,可以使用所有初始层和最终层(包括FC层)提取超列。这里我将分别提取它们,以显示它们在可视化图中的不同之处。

简单hypercolumn像素集群

现在,你可以做很多事情,你可以使用这些超列为一些任务分类像素,做自动像素着色,分割,等等。我在这里要做的只是一个实验,是使用超列(从vga -16层3、8、15、22、29),然后使用KMeans和2个集群:

米= hc.transpose(1,2,0).reshape(50176,-1)k均值= cluster.KMeans(n_clusters = 2,max_iter = 300,n_jobs = 5,precompute_distances =真)cluster_labels = k均值.fit_predict(M)imcluster = np.zeros((224224))imcluster = imcluster.reshape((224 * 224))= imcluster cluster_labels plt.imshow(imcluster.reshape(224,224),CMAP = “热”)
使用超列的KMeans集群。
使用超列的KMeans集群。

现在,你可以想像是多么有用hypercolumns可以像关键点提取,分割等,这是一个非常优雅的,简单实用的理念任务。亚洲金博宝

希望你喜欢!

- Christian S. Perone

引用本文为:基督教S. Perone,“在Python卷积hypercolumns,”在亚洲金博宝未知领域,2016年11月1日,//www.cpetem.com/2016/01/convolutional-hypercolumns-in-python/

机器学习::文本特征提取(TF-IDF) - 第二部分

阅读本教程的第一部分:文本特征提取(TF-IDF) - 第一部分

这个职位是一个延续在哪里,我们开始学习有关文本特征提取和向量空间模型表示的理论和实践的第一部分。我真的建议你阅读第一部分后一系列以遵循这个第二。

因为很多人喜欢本教程的第一部分,所以本教程的第二部分比第一部分要长一些。

介绍

在第一篇文章中,我们学会了如何使用长期频以表示在矢量空间的文本信息。然而,与术语频率方法的主要问题是,它大大加快了频繁的条款和规模下降,这比高频方面经验更丰富罕见的条款。基本的直觉是,在许多文件中经常出现的一个术语不太好鉴别,真正有意义的(至少在许多实验测试);这里最重要的问题是:你为什么会在例如分类问题,强调术语,是在你的文档的整个语料库几乎礼物?

在TF-IDF权重来解决这个问题。什么TF-IDF给出的是如何重要的是一个集合中的文档的话,这就是为什么TF-IDF结合本地和全球的参数,因为它考虑到不仅需要隔离的期限,但也文献集内的术语。什么TF-IDF然后做来解决这个问题,是缩小,同时扩大了难得的条件频繁的条款;出现比其他的10倍以上期限不为10倍比它更重要的是,为什么TF-IDF采用对数刻度的做到这一点。

但是,让我们回到我们的定义\ mathrm {TF}(T,d)这实际上是长期的长期计数Ť在文档中d。使用这个简单的术语频率可能会导致这样的问题滥用关键字,即我们在文件中有一个重复的词,目的是改善该词在IR (信息检索)系统,甚至对长文档产生偏见,使它们看起来比实际更重要,仅仅因为这个词在文档中出现的频率很高。

为了克服这个问题,词频\ mathrm {TF}(T,d)向量空间上的文档通常也是标准化的。我们来看看如何标准化这个向量。

矢量归一化

假设我们要正常化术语频矢量\ {VEC V_ {D_4}}我们在本教程的第一部分计算过。文档D4从本教程的第一部分开始,有这样的文本表示:

我们可以看到灿烂的太阳,明亮的太阳。

和使用该文件的非归一化项频向量空间表示为:

\ {VEC V_ {D_4}} =(0,2,1,0)

为了归一化矢量,是相同的计算单位向量矢量,而他们使用的是“帽子”符号表示:\帽子{V}。的单位矢量的定义\帽子{V}一个向量的\ VEC {V}是:

\的DisplayStyle \帽子{V} = \压裂{\ vec的{V}} {\ | \ vec的{V} \ | _p}

\帽子{V}单位向量,或者说标准化向量\ VEC {V}在矢量将被归一化和vec {v} \ | \ \ | _p是矢量的范数(大小,长度)\ VEC {V}在里面p L ^空间(别担心,我将所有的解释)。

的单位矢量实际上无非是矢量的归一化版本的更多,是一种载体,其长度为1。

归一化处理(来源:http://processing.org/learning/pvector/)
归一化处理(来源:http://processing.org/learning/pvector/)

但这里重要的问题是向量的长度是如何计算的为了理解它,你必须理解动机p L ^空间,也被称为勒贝格空间

勒贝格空间

多久这个载体?(来源:来源:http://processing.org/learning/pvector/)
多久这个载体?(来源:来源:http://processing.org/learning/pvector/)

通常是向量的长度\vec{u} = (u_1, u_2, u_3, \ldots, u_n)是由欧几里得范数-范数是向向量空间中的所有向量分配严格正的长度或大小的函数-,其定义为:

(来源:http://processing.org/learning/pvector/)
(来源:http://processing.org/learning/pvector/)

\ | \ VEC【U} \ |= \ SQRT【U ^ 2_1 + U ^ 2_2 + U ^ 2_3 + \ ldots + U ^ 2_n}

但是,这不是定义长度的唯一途径,这就是为什么你看到(有时)的数p符合规范的符号,就像在了一起\ | \ VEC【U} \ | _p。这是因为它可以被概括为:

\的DisplayStyle \ | \ VEC【U} \ | _p =(\左| U_1 \右| ^ P + \左| U_2 \右| ^ P + \左| U_3 \右| ^ P + \ ldots + \左|u_n \右| ^ p)^ \压裂{1} {p}

并简化为:

vec{你}\ displaystyle \ | \ \ | _p =(\ \和limits_ {i = 1} ^ {n} \左右vec{你}_i | \ \ | ^ p) ^ \压裂{1}{p}

所以,当你阅读有关L2范,你正在阅读关于欧几里得范数,具有规范p = 2时用于测量的矢量的长度的最常用标准,通常称为“大小”;其实,当你有一个不合格的长度测量(不p号),你有L2范(欧几里得范数)。

当你读到aL1-norm,你正在阅读规范P = 1, 定义为:

\的DisplayStyle \ | \ VEC【U} \ | _1 =(\左| U_1 \右| + \左| U_2 \右| + \左| U_3 \右| + \ ldots + \左| u_n \右|)

它只不过是矢量分量的简单和,也叫出租车的距离,也被称为曼哈顿距离。

出租车几何与欧几里得距离:在出租车几何所有三个描绘线具有对于相同的路径具有相同的长度(12)。在欧几里德几何,绿色的线有长度,6 \乘以\√{2}\大约8。48,是唯一的最短路径。
来源:维基百科::出租车几何

请注意,您也可以使用任何规范正常化的载体,但我们将使用最常用的规范,L2范数,这也是在0.9版本的默认scikits.learn。You can also find papers comparing the performance of the two approaches among other methods to normalize the document vector, actually you can use any other method, but you have to be concise, once you’ve used a norm, you have to use it for the whole process directly involving the norm (即所使用的L1范数的单位矢量是不会具有长度1,如果你要以后采取其L2范数)。

返回矢量归

现在你知道了矢量正常化进程是什么,我们可以尝试一个具体的例子,使用L2范数的过程(我们现在使用正确的术语),以规范我们的矢量\ {VEC V_ {D_4}} =(0,2,1,0)为了得到其单位向量\ {帽子V_ {D_4}}。为此,我们简单地把它代入单位向量的定义来求值:

\帽子{v} = \压裂vec {v}} {\ vec {v} {\ | \ \ | _p} \ \ \ \ \帽子{v_ {d_4}} = \压裂{\ vec {v_ {d_4}}} {| | \ vec {v_ {d_4}} | | _2} \ \ \ \ \ \ \帽子{v_ {d_4}} = \压裂{(0 2 1,0)}{\√6{0 ^ 2 + 2 ^ 2 + 1 ^ 2 + 0 ^ 2}}\ \ \ \ \帽子{v_ {d_4}} = \压裂{(0 2 1,0)}{\ sqrt{5}} \ \ \ \ \ \小帽子{v_ {d_4}} = (0.0, 0.89442719, 0.4472136, 0.0)

就是这样!归一化向量\ {帽子V_ {D_4}}现在有l2标准吗\ | \帽子{V_ {D_4}} \ | _2 = 1.0

请注意,这里我们归我们词频文档向量,但后来我们要做的是,TF-IDF的计算后。

术语频率-逆文件频率(tf-idf)的权重

现在您已经理解了向量归一化在理论和实践中是如何工作的,让我们继续我们的教程。假设您的集合中有以下文档(取自本教程的第一部分):

火车文档集:D1:天空是蓝色的。D2:阳光灿烂。测试文档集:D3:在天空,阳光灿烂。我们可以看到灿烂的太阳,明亮的太阳。

您的文档空间可以那么作为被定义D = \{d_1, d_2, \ldots, d_n \}哪里ñ您的语料库中的文件数量,在我们的情况下是D_ {火车} = \ {D_1,D_2 \}D_ {测试} = \ {D_3,D_4 \}。我们的文档空间的基数被定义左\ | {D_{火车}}\ | = 2\左| {{D_测试}} \右|= 2,因为我们只有2两个用于训练和测试文档,但他们显然并不需要有相同的基数。

现在让我们看看idf(逆文档频率)是如何定义的:

\ displaystyle \ mathrm {idf} (t) = \ log{\压裂{\左| D \右|}{1 +左| \ \ {D: t \ D \} \右|}}

哪里\左| \ {d:T \在d \} \右|文件数其中术语Ť出现,术语频率函数满足当\ mathrm {TF}(T,d)\ 0 NEQ,我们只加1代入公式,以避免零分。

为TF-IDF式则是:

\ mathrm {TF \ MBOX { - } IDF}(T)= \ mathrm {TF}(T,d)\倍\ mathrm {IDF}(t)的

和该公式具有重要的后果:当你有给定文档中高词频(TF)达到TF-IDF计算的高权重(局部参数)及该词在整个馆藏中出现的频率较低(全局参数)。

现在,让我们计算每个出现在与我们在第一个教程计算词频特征矩阵功能的IDF:

M_{train} = \begin{bmatrix} 0 & 1 & 1 & 1\\ 0 & 2 & 1 & 0 \end{bmatrix}

因为我们有4个特点,我们要计算\ mathrm {idf} (t_1)\ mathrm {IDF}(T_2)\ mathrm {IDF}(t_3处)\ mathrm {IDF}(T_4)

\ mathrm {IDF}(T_1)= \日志{\压裂{\左| d \右|} {1+ \左| \ {d:T_1 \在d \} \右|}} = \日志{\压裂{2} {1}} = 0.69314718

\ mathrm {IDF}(T_2)= \日志{\压裂{\左| d \右|} {1+ \左| \ {d:T_2 \在d \} \右|}} = \日志{\压裂{2} {3}} = -0.40546511

\ mathrm {IDF}(t_3处)= \日志{\压裂{\左| d \右|} {1+ \左| \ {d:t_3处\在d \} \右|}} = \日志{\压裂{2} {3}} = -0.40546511

\ mathrm {idf} (t_4) = \ log{\压裂{\左| D \右|}{1 +左| \ \{在D D: t_4 \ \} \右|}}= \ log{\压裂{2}{2}}= 0.0

这些idf权重可以用一个向量表示为:

\ {VEC {idf_列车}} =(0.69314718,-0.40546511,-0.40546511,0.0)

现在,我们有我们的词频矩阵(M_{火车})和表示我们的矩阵的每个特征的IDF(矢量\ {VEC {idf_列车}}),我们可以计算tf-idf权重。我们要做的是简单的矩阵的每一列的乘法M_{火车}与各自的\ {VEC {idf_列车}}向量维度。要做到这一点,我们可以创建一个正方形对角矩阵被称为M_ {idf}同时与垂直和水平尺寸等于向量\ {VEC {idf_列车}}尺寸:

M_ {idf}=   \begin{bmatrix}   0.69314718 & 0 & 0 & 0\\   0 & -0.40546511 & 0 & 0\\   0 & 0 & -0.40546511 & 0\\   0 & 0 & 0 & 0   \end{bmatrix}

然后乘以项频率矩阵,则最终结果可定义为:

M_ {TF \ MBOX { - } IDF} = M_ {火车} \倍M_ {IDF}

请注意,矩阵乘法是不可交换的,结果A \乘以B会比的结果不同乙\一个时代,这就是为什么M_ {idf}在乘法的右侧,以达到将每个idf值乘以其对应特征的预期效果:

\begin{bmatrix}   \mathrm{tf}(t_1, d_1) & \mathrm{tf}(t_2, d_1) & \mathrm{tf}(t_3, d_1) & \mathrm{tf}(t_4, d_1)\\   \mathrm{tf}(t_1, d_2) & \mathrm{tf}(t_2, d_2) & \mathrm{tf}(t_3, d_2) & \mathrm{tf}(t_4, d_2)   \end{bmatrix}   \times   \begin{bmatrix}   \mathrm{idf}(t_1) & 0 & 0 & 0\\   0 & \mathrm{idf}(t_2) & 0 & 0\\   0 & 0 & \mathrm{idf}(t_3) & 0\\   0 & 0 & 0 & \mathrm{idf}(t_4)   \end{bmatrix}   \\ =   \begin{bmatrix}   \mathrm{tf}(t_1, d_1) \times \mathrm{idf}(t_1) & \mathrm{tf}(t_2, d_1) \times \mathrm{idf}(t_2) & \mathrm{tf}(t_3, d_1) \times \mathrm{idf}(t_3) & \mathrm{tf}(t_4, d_1) \times \mathrm{idf}(t_4)\\   \mathrm{tf}(t_1, d_2) \times \mathrm{idf}(t_1) & \mathrm{tf}(t_2, d_2) \times \mathrm{idf}(t_2) & \mathrm{tf}(t_3, d_2) \times \mathrm{idf}(t_3) & \mathrm{tf}(t_4, d_2) \times \mathrm{idf}(t_4)   \end{bmatrix}

让我们看一个乘法的具体例子:

M_ {TF \ MBOX { - } IDF} = M_ {火车} \倍M_ {IDF}= \\   \begin{bmatrix}   0 & 1 & 1 & 1\\   0 & 2 & 1 & 0   \end{bmatrix}   \times   \begin{bmatrix}   0.69314718 & 0 & 0 & 0\\   0 & -0.40546511 & 0 & 0\\   0 & 0 & -0.40546511 & 0\\   0 & 0 & 0 & 0   \end{bmatrix} \\   =   \begin{bmatrix}   0 & -0.40546511 & -0.40546511 & 0\\   0 & -0.81093022 & -0.40546511 & 0   \end{bmatrix}

最后,我们可以把L2归一化过程应用到M_ {TF \ MBOX { - }} IDF矩阵。请注意,这正常化“逐行”因为我们要处理矩阵的每一行作为一个分离向量进行归一化,而不是矩阵作为一个整体:

M_ {TF \ MBOX { - } IDF} = \压裂{M_ {TF \ MBOX { - } IDF}} {\ | M_ {TF \ MBOX { - } IDF} \ | _2} = \begin{bmatrix} 0 & -0.70710678 & -0.70710678 & 0\ 0 & -0.89442719 & -0.4472136 & 0\ end{bmatrix}

这就是我们测试文档集的标准化tf-idf权值,它实际上是单位向量的集合。如果你取矩阵每一行的l2范数,你会发现它们的l2范数都是1。

Python的实践

环境使用Python的v.2.7.2NumPy的1.6.1SciPy的v.0.9.0Sklearn v.0.9 (Scikits.learn)

现在是你等待的区域了!在本节中,我将使用Python展示使用Scikit.learn特征提取模块。

第一步是创建我们的训练和测试文档集和计算词频矩阵:

从sklearn.feature_extraction.text进口CountVectorizer train_set =(“天空是蓝色的。”,“阳光灿烂”。)TEST_SET =(“在天空中的太阳是光明的。”,“我们可以看到闪耀的太阳,。明亮的太阳“)count_vectorizer = CountVectorizer()count_vectorizer.fit_transform(train_set)打印 ”词汇“,count_vectorizer.vocabulary#词汇:{ '蓝':0, '太阳':1, '鲜艳':2 '天空':3} freq_term_matrix = count_vectorizer.transform(TEST_SET)打印freq_term_matrix.todense()#[[0 1 1 1]#[0 2 1 0]]

现在我们有了频率项矩阵(称为freq_term_matrix),我们可以实例化TfidfTransformer,这将是负责来计算我们的词频矩阵TF-IDF权重:

从sklearn.feature_extraction。Ťext import TfidfTransformer tfidf = TfidfTransformer(norm="l2") tfidf.fit(freq_term_matrix) print "IDF:", tfidf.idf_ # IDF: [ 0.69314718 -0.40546511 -0.40546511 0. ]

请注意,我所指定的标准为L2,这是可选的(实际上默认为L2范数),但我已经添加了参数,使其明确向你表示,它会使用L2范数。还要注意的是,你可以通过访问称为内部属性看IDF计算权重idf_。现在,符合()方法计算出了矩阵的idf,让我们变换freq_term_matrix到TF-IDF权重矩阵:

tf_idf_matrix = tfidf.transform(freq_term_matrix)打印tf_idf_matrix.todense()#[[0 -0.70710678 -0.70710678 0]#[0 -0.89442719 -0.4472136 0]]

这就是它的tf_idf_matrix其实我们以前M_ {TF \ MBOX { - }} IDF矩阵。您可以通过使用达到相同的效果矢量器类Scikit.learn的这是一个矢量器自动结合CountVectorizerTfidfTransformer给你。看到这个例子要知道如何使用它的文本分类过程。

我真的希望你喜欢这篇文章,我试着让它尽可能简单,甚至对那些没有线性代数等数学背景的人。在下一篇机器学习文章中,我希望向您展示如何使用tf-idf来计算余弦相似度。

如果你喜欢,随时提出意见和建议,修改等。

引用本文为:基督教S. Perone,“机器学习::文本特征提取(TF-IDF) - 第二部分”,在亚洲金博宝未知领域,03/10/2011,//www.cpetem.com/2011/10/machine-learning-text-feature-extraction-tf-idf-part-ii/

参考文献

理解逆文档频率:对IDF理论论证

维基百科:tf-idf

经典的向量空间模型

Sklearn文本特征提取码

更新

2015年3月13日-格式,固定的图像问题。
2011 10月3日-添加了有关使用Python示例环境信息

机器学习::文本特征提取(TF-IDF) - 第一部分

简短的介绍向量空间模型(VSM)

在信息检索和文本挖掘中,术语频率 - 逆文档频率(也叫TF-IDF),是一个众所周知的方法来评估是多么的重要文档中的文字。TF-IDF是一个非常有趣的信息亚洲金博宝文本表示转换成一种方式向量空间模型(VSM),或到稀疏的特点,我们将讨论更多关于它以后,但首先,让我们试着去了解什么是TF-IDF和VSM。

VSM有一个非常令人亚洲金博宝困惑的过去,例如报纸杰拉德·索尔顿从未写过的最有影响力的论文这解释了鬼背后的历史援引这其实从来没有存在过的纸张;在总和,VSM是表示文本信息作为矢量的代数模型,这个矢量的分量可以表示术语(TF-IDF)的重要性或甚至不存在或存在(文字包)它的一个文件中;它是要注意重要的是通过索尔顿提出的经典VSM结合本地和全球的参数/信息(它使用两个分离项进行分析,以及文档的整个集合感)。VSM,解释的广义上,是其中文本被表示为数字的而不是它的原始字符串的文本表示的向量的空间;在VSM表示从文件中提取的特征。

让我们试着从数学结合具体实例定义VSM和TF-IDF在一起,我将使用Python具体的例子(以及惊人scikits.learnPython模块)。

要向量空间

在文档建模成向量空间中的第一步骤是创建一个字典方面呈现文档。To do that, you can simple select all terms from the document and convert it to a dimension in the vector space, but we know that there are some kind of words (stop words) that are present in almost all documents, and what we’re doing is extracting important features from documents, features do identify them among other similar documents, so using terms like “the, is, at, on”, etc.. isn’t going to help us, so in the information extraction, we’ll just ignore them.

让我们以下面的文件来定义我们的(愚蠢)文件空间:

火车文档集:D1:天空是蓝色的。D2:阳光灿烂。测试文档集:D3:在天空,阳光灿烂。我们可以看到灿烂的太阳,明亮的太阳。

现在,我们要做的是创造的列车文档集合词的索引词汇(字典),使用的文件D1D2从文档集,我们将有以下索引词汇表示为\ mathrm} {E (t)在哪里Ť是项:

\ mathrm} {E (t)=   \begin{cases}   1, & \mbox{if } t\mbox{ is ``blue''} \\   2, & \mbox{if } t\mbox{ is ``sun''} \\   3, & \mbox{if } t\mbox{ is ``bright''} \\   4, & \mbox{if } t\mbox{ is ``sky''} \\   \end{cases}

注意像“is”和“the”这样的术语在前面被忽略了。现在我们有了一个索引词汇,我们可以把测试文档设置转换成一个向量空间,每一项向量索引的索引词汇,所以第一项向量代表的“蓝色”术语的词汇表,第二个是“太阳”等等。现在,我们要用长期频代表在我们的矢量空间中的每个术语;术语频无非条款存在于我们的词汇量有多少次的度量\ mathrm} {E (t)存在于文件D3D4,我们将terms -frequency定义为耦合函数:

\ mathrm {tf} (t、d) = \ \ limits_总和{x \ d} \ mathrm {fr} (x, t)

在哪里\ mathrm {FR}(X,T)是定义为一个简单的函数:

\mathrm{fr}(x,t) =   \begin{cases}   1, & \mbox{if } x = t \\   0, & \mbox{otherwise} \\   \end{cases}

那么,是什么特遣部队(t, d)回报是多少次的术语Ť存在于文档中d。这方面的例子,可以TF(``太阳 '',D4)= 2因为我们只有两次出现了“太阳”一词的文档中D4。现在你明白了词频是如何工作的,我们可以继续创建文档向量,它表示为:

vec {v_ \ displaystyle \ {d_n}} = (\ mathrm {tf} (t_1 d_n) \ mathrm {tf} (t_2 d_n) \ mathrm {tf} (t_3, d_n) \ ldots \ mathrm {tf} (t_n d_n))

文档向量的每个尺寸由词汇的术语表示,例如,该d_2 \ mathrm {tf} (t_1)表示该术语的频率项1或T_1(这是我们的“蓝色”的词汇术语)的文件中D_2

现在,让我们展示如何文件的具体例子D_3D_4被表示为向量:

vec {v_ \ {d_3}} = (\ mathrm {tf} (t_1、d_3) \ mathrm {tf} (t_2 d_3) \ mathrm {tf} (t_3、d_3) \ ldots \ mathrm {tf} (t_n d_3)) \ \ \ vec {v_ {d_4}} = (\ mathrm {tf} (t_1、d_4) \ mathrm {tf} (t_2 d_4) \ mathrm {tf} (t_3、d_4) \ ldots \ mathrm {tf} (t_n d_4))

计算结果为:

\ {VEC V_ {D_3}}= (0, 1, 1, 1) \\   \vec{v_{d_4}} = (0, 2, 1, 0)

正如你所看到的,因为文件D_3D_4是:

天空中的太阳是明亮的。我们可以看到灿烂的太阳,明亮的太阳。

所得载体\ {VEC V_ {D_3}}显示,按顺序,术语“blue”出现0次,术语“sun”出现1次,以此类推。在\ {VEC V_ {D_3}},我们有0次出现“蓝色”,2次出现“太阳”,等等。

别急,因为我们有文件,现在矢量代表的集合,我们可以代表他们作为基质| | \ D * F形状,| d |文档空间的基数,或者我们有多少文档F为特征的数量,在我们的例子代表由词汇量。上述载体的矩阵表示的例子是:

M_ D{| | \乘以}=   \begin{bmatrix}   0 & 1 & 1 & 1\\   0 & 2 & 1 & 0   \end{bmatrix}

正如你可能已经注意到,代表了词频这些矩阵往往是非常亚洲金博宝(与大多数归零项),这就是为什么你会看到这些矩阵作为稀疏矩阵的一种常见表现。

Python的实践

环境使用Python的v.2.7.2NumPy的1.6.1SciPy的v.0.9.0Sklearn v.0.9 (Scikits.learn)

既然我们知道了频率和向量空间转换背后的理论,让我们来演示一下使用惊人的方法是多么简单scikit.learnPython模块。

Scikit.learnComes with许多实例现实生活中也很有趣数据集你可以用and also some辅助功能下载例如18K新闻组帖子。

由于我们之前已经定义了我们的小火车/测试数据集,让我们用他们的方式,scikit.learn可用于定义数据集:

train_set =(“天空是蓝色的。”,“阳光灿烂”。)TEST_SET =(“在天空中的太阳是光明的。”,“我们可以看到闪亮的阳光,灿烂的阳光。”)

在scikit.learn,我们所提出的术语频率,被称为CountVectorizer,所以我们需要导入它并创建一个news实例:

从进口sklearn.feature_extraction.text CountVectorizer矢量器= CountVectorizer()

CountVectorizer已经使用作为默认的“分析器”调用WordNGramAnalyzer,这是负责的文本字符转换,重音去除,令牌提取,过滤停用词,等等......你可以打印类信息,请参阅详细信息:

['all', 'six', 'less', 'being', 'indeed', 'over', 'move', 'anyway', 'four', 'not', 'own', 'through', ' self ',(…)

现在让我们创建词汇索引:

vectorizer.fit_transform (train_set)打印vectorizer。词汇{“蓝色”:0,“太阳”:1、“明亮”:2,“天空”:3}

看到创建的词汇是一样的E (t)(除了因为它是零索引)。

让我们使用相同的矢量化现在创建的稀疏矩阵我们TEST_SET文档:

SMATRIX = vectorizer.transform(TEST_SET)打印SMATRIX(0,1)1(0,2)1(0,3)1(1,1)2(1,2)1

需要注意的是稀疏矩阵创建名为SMATRIXSciPy的稀疏矩阵与存储在元素坐标格式。但是你可以把它转换成一个密集的格式:

smatrix.todense()矩阵([[0,1,1,1],........ [0,2,1,0]],D型细胞= int64类型)

注意,创建的稀疏矩阵是相同的矩阵M_ D{| | \乘以}我们引用前面在这篇文章中,它代表了两个矢量\ {VEC V_ {D_3}}\ {VEC V_ {D_4}}

我们将在接下来的文章中看到,我们如何定义IDF逆文档频率),而不是简单的术语频率,如规模以及如何对数被用于根据其重要性进行调整词频的测量,以及我们如何能够利用一些众所周知的机器学习方法的使用它来区分文档。

我希望你喜欢这个职位,如果你真的很喜欢,发表评论,所以我会就能知道是否有足够多的人热衷于这些系列的机器学习主题文章。

按照承诺,这是第二部分这个系列教程。

引用这篇文章为:Christian S. Perone,“机器学习::文本特征提取(tf-idf) -第一部分”亚洲金博宝未知领域18/09/2011,//www.cpetem.com/2011/09/machine-learning-text-feature-extraction-tf-idf-part-i/

参考文献

经典的向量空间模型

最有影响力的论文杰拉德·索尔顿从未写过

维基百科:TF-IDF

维基百科:向量空间模型

Scikits.learn例子

更新

9月21日11-修正了一些拼写错误和矢量符号
11年9月22日-根据新的0.9版本修正了sklearn的导入,增加了环境部分
02年10月11日- 固定乳胶数学错别字
11年10月18日-添加链接到教程系列的第二部分
04年3月11日-修正格式问题