lda编译原理
⑴ 要学数据挖掘需要哪些基础
人工智能、机器学习、模式识别、统计学、数据库、可视化技术等。
数据挖掘从数据库的大量数据中揭示出隐含的、先前未知的并有潜在价值的信息,数据挖掘主要基于人工智能、机器学习、模式识别、统计学、数据库、可视化技术等,高度自动化地分析企业的数据;
作出归纳性的推理,从中挖掘出潜在的模式,帮助决策者调整市场策略,减少风险,作出正确的决策。
(1)lda编译原理扩展阅读
数据挖掘起源于“情报深加工”,前身为“知识发现”,其实质就是找寻出数据背后的“故事”。用好数据挖掘技术,就能破除信息化战场的“数据迷雾”,从而发现数字背后的奥秘,从战略、战役、战术各个层面准确掌握战场态势及对手作战特点。
信息化战争中,军事决策的正确、及时与否,直接决定战争行动的成败。数据挖掘技术的出现,可以帮助军事决策人员从海量战场数据中分析获取有价值信息,进而为作战筹划等军事决策提供有力支撑。
借助专家系统、遗传算法,可高效完成兵力区分、战术编组、队形配置等决策;借助关联算法、统计决策,可准确预判敌人的行动路线,对重要目标实施保护;借助“决策树”方法、人工神经网络以及可视化技术等,可进行目标火力分配。
数据挖掘还可以进行战场环境分析,实现战场态势的精确感知,为指挥员提供更加清晰的战场态势显示。
⑵ 数据挖掘工程师一般都做什么
数据挖掘工程师是做什么的?
数据挖掘,从字面上理解,就是在数据中找到有用的东西,哪些东西有用就要看具体的业务目标了。最简单的就是统计应用了,比如电商数据,如淘宝统计过哪个省购买泳衣最多、哪个省的女生胸罩最大等,进一步,可以基于用户的浏览、点击、收藏、购买等行为推断用户的年龄、性别、购买能力、爱好等能表示一个人的画像,就相当于用这些挖掘出来的属性来刻画一个人,这些还是最简单的东西,更深层次的比如预测(股票预测),但是比较难。
数据挖掘往往与机器学习离不开。比如分类、聚类、关联规则挖掘、个性化推荐、预测、神经网络、深度学习等。
数据挖掘 = 业务知识 + 自然语言处理技术( NLP ) + 计算机视觉技术( CV ) + 机器学习 / 深度学习( ML/DL )
( 1 )其中业务知识具体指的是个性化推荐,计算广告,搜索,互联网金融等; NLP , CV 分别是处理文本,图像视频数据的领域技术,可以理解为是将非结构化数据提取转换成结构化数据;最后的ml/dl 技术则是属于模型学习理论;
( 2 )在选择岗位时,各个公司都没有一套标准的称呼,但是所做的事情无非 2 个大方向,一种是主要钻研某个领域的技术,比如自然语言处理工程师,计算机视觉工程师,机器学习工程师等;一种是将各种领域技术应用到业务场景中去解决业务需求,比如数据挖掘工程师,推荐系统工程师等;具体的称呼不重要,重要的是平时的工作内容;
PS :在互联网行业,数据挖掘相关技术应用比较成功的主要是推荐以及计算广告领域,而其中涉及到的数据主要也是文本,所以 NLP 技术相对来讲比较重要,至于 CV 技术主要还是在人工智能领域(无人车,人脸识别等)应用较多,本人了解有限,相关的描述会较少;
数据挖掘岗位需要具备的3 种基本能力
1. 工程能力
( 1 )编程基础:需要掌握一大一小两门语言,大的指 C++ 或者 java ,小的指 python 或者 shell 脚本;需要掌握基本的数据库语言;
建议: MySQL + python + C++ ;语言只是一种工具,看看语法就好;
推荐书籍:《 C++ primer plus 》
( 2 )开发平台: Linux ;
建议:掌握常见的命令,掌握 Linux 下的源码编译原理;
推荐书籍:《 Linux 私房菜》
( 3 )数据结构与算法分析基础:掌握常见的数据结构以及操作(线性表,队,列,字符串,树,图等),掌握常见的计算机算法(排序算法,查找算法,动态规划,递归等);
建议:多敲代码,多上 OJ 平台刷题;
推荐书籍:《大话数据结构》《剑指 offer 》
( 4 )海量数据处理平台: Hadoop ( mr 计算模型, java 开发)或者 Spark ( rdd 计算模型, scala开发),重点推荐后者;
建议:主要是会使用,有精力的话可以看看源码了解集群调度机制之类的;
推荐书籍:《大数据 spark 企业级实战》
2. 算法能力
( 1 )数学基础:概率论,数理统计,线性代数,随机过程,最优化理论
建议:这些是必须要了解的,即使没法做到基础扎实,起码也要掌握每门学科的理论体系,涉及到相应知识点时通过查阅资料可以做到无障碍理解;
( 2 )机器学习 / 深度学习:掌握 常见的机器学习模型(线性回归,逻辑回归, SVM ,感知机;决策树,随机森林, GBDT , XGBoost ;贝叶斯, KNN , K-means , EM 等);掌握常见的机器学习理论(过拟合问题,交叉验证问题,模型选择问题,模型融合问题等);掌握常见的深度学习模型( CNN ,RNN 等);
建议:这里的掌握指的是能够熟悉推导公式并能知道模型的适用场景;
推荐书籍:《统计学习方法》《机器学习》《机器学习实战》《 UFLDL 》
( 3 )自然语言处理:掌握常见的方法( tf-idf , word2vec , LDA );
3. 业务经验
( 1 )了解推荐以及计算广告相关知识;
推荐书籍:《推荐系统实践》《计算广告》
( 2 )通过参加数据挖掘竞赛熟悉相关业务场景,常见的比赛有 Kaggle ,阿里天池, datacastle 等。
想要学习数据挖掘的话可以看一下这篇文章《AI时代就业指南:数据挖掘入门与求职》
⑶ NLP自然语言处理
罗素悖论:由所有不包含自身的集合构成的集合
例子:理发师称只给那些不给自己理发的人理发。
基于集合论,理发师无论给自己理发还是不给自己理发都是矛盾的。
因此集合论不是完备的。 即使后面冯罗伊德等科学家提出了各种假定条件。
由于上述的原因,集合率无法很好的描述自然语言,科学家发现通过概率模型可以更好的描述自然语言。
深度学习来处理自然语言属于概率模型
证明最小点位于坐标轴上
h = f+c|x|
由于在x = 0处不可导
h-left'(0)*h-right'(0) = (f'+c)*(f'-c)
那么如果c>|f'(0)|可得,h在0处左右导数异号
0是最值。
那么在损失函数加入L1正则化后,可以得到某些维度容易为0,从而得到稀疏解
几乎所有的最优化手段,都将适用凸优化算法来解决
P(A|B) = P(A and B) / P(B)
if A and B 独立
=》P(A and B| C) = P(A|C)*P(B|C)
也可以推出
=>A(A|B and C) = P(A|C) (B交C不为空)
抛9次硬币,硬币出现正面的概率是0.5,出现k次的概率分布如下如
服从正态分布
x的平均值
E = x*p(x) + ...
x相对于期望的偏离
var = (x-E(x))^2
conv = (x - E(x))*(m - E(m))
描述x,m是否有同分布
按理协方差为0,并不代表x和m没有关系
例如下图
如果点的分布对称的分布,会得到协方差为0,但是其实他们是有关系的。
把每个相关的概率累加,得到联合概率
P(x1=m1,x2=m2...) = n!*P1 m1/m1!*P2 m2/m2!
T(n) = (n-1)!
T(x)用一条曲线逼近n!,进而可以求得非整数的阶乘
由二项式分布推出
P = T(a+b)*x (a-1)*(1-x) (b-1)/(T(a)*T(b))
则正态分布
y为0时,不考虑y‘。y为1时,y'越接近1,越小,越靠近0,越大
把D最小化,迫使y'逼近y
对于一个句子,有若干单词组成。例如
C1: The dog laughs.
C2: He laughs.
那么计算P(C1) = P(The, Dog, laughs)的概率和P(C2) = P(He, laughs)的概率。
根据历史文本的统计学习。
可以得到P(C1)<<P(C2)
P('I love the game') = P('I')*P('love')*P('the')*P('game')
其中P(<work>) = 频率/总单词数
计算一篇文章是积极的还是消极的。
P(y|x) = sigmod(wx)
x是文章内每个单词的频率
y表示积极和消极情感
其中P(xk|x1, x2,..xk-1) = frequence(x1, x2 ,, xk)/frequence(x1, x2..xk-1)
2-gram模型例子
把多个gram的模型进行线性整合
P(y|x1, x2, .. xn) = P(y)*P(x1, x2, ... xn|y) / P(x1, x2, ... xn)
y代表是否是垃圾邮件
x代表单词
广州市长寿路 -》 广州市长|寿路
广州市长寿路 -》 广州市|长寿路
匹配词袋:广州市,广州市长,长寿路
使用最大匹配发,第二个分词更优
通过统计P(A|B),得出各个option的概率,取最大的概率,则为最后的分词
word => [0, 0 , ... 1, ... 0]
word => [0, 1, 0, 1, 0, ...]
可以解决词相似性问题
计算附近词的频率
word => [0, 3, 0, 1, 0, ...]
w是附近词的one-hot encoding
score是词的one-hot encoding
最后一层通过softmax,取拟合文本
最终中间层则为词向量
输入为词one-hot encoding
输出为附近此的one-hot encoding
最后通过softmax预测附近词
最后中间层则为结果词向量
混合模型是一种统计模型,问题中包含若干个子问题,每个子问题是一个概率分布,那么总问题就是若干个子问题的组合,也就是若干个子分部的组合,这样就形成了混合模型。
有红黑两种硬币,把它们放在盒子里,从盒子里随机抽取一个硬币并投币,抽到红色的概率是p,红色硬币正面的概率是q,黑色硬币正面的概率是m,假设我们没办法看到抽取出的硬币的颜色,只能看到最终是正面或者反面的结果,例如HTTHTTTTHHH (H:正面 T: 反面)。需要估计p,q,m三个参数。
此时可以计算出
通过EM算法迭代如下:
随机p q m
迭代以下过程:
计算上面table
p = (aC(正)+cC(反))/total
q = aC(正)/(aC正+cC正)
m = bC(正)/(bC正 + dC正)
假设有上述数据,需要用混合模型来逼近,通过分析,红色和蓝色数据分别为高斯正态分布,N(u, v)
此时可以得到如下表
p = pN红x/(pN红x+(1-p)N蓝x)
u = pN红x/n
v = pN红(x-u)^2/n
词性转换概率
词性到单词的转换概率
通过EM递归算法,训练以上参数,得到隐马尔可夫模型
PLSA主题模型
只统计词的频率,不计算词的相对位置
计算文档和单词频率的矩阵
进行奇异矩阵分解
得到A矩阵的压缩U,U中的k则为k个主题
通过分析,LSA得到的主题是跟现实无法关联,它只是一个量,而没有明显的意义。
PLSA为了解决此问题,引入概率模型,先确定主题个数
然后通过构建Doc->topic的概率table,和topic->word的概率table。
然后通过EM模型,得到这两个table的所有概率值。
进而得到文档的主题表示
PLSA的缺陷是,对于预测未知的doc,无法计算此文档的相关概率。随着doc数量的增加,PLSA模型的参数会线性增加,从而会造成过拟合。
LDA通过引入先验概率来克服PLSA的问题。
类似于编译原理的上下文无法句法分析,一颗语法树
通过对CFG引入概率参数
有了概率,可以计算每颗语法树的极大似然概率,并取最大概率的树为最终输出
上一个状态中间层的输出作为下一隐层的输入
类似于HMM的2-gram模型。t状态受到t-1时刻输出的影响,受t-k的输出的k越大,影响越小
由于RNN几乎只受到上一时刻的影响,而忽略了久远信息的影响。从而造成了一定的局限性。
LSTM通过引入长短记忆方法,来维持长记忆的信息。
通过训练核内的sigmod函数,使得LSTM可以根据不同的句子,有条件的保留和过滤历史信息,从而达到长记忆的功能。
GRU是LSTM的简化版,它只需要处理两个sigmod函数的训练,而LSTM需要三个sigmod函数的训练,减少了训练的参数,加快了训练的速度,但也损失了一部分模型的复杂,在处理较复杂问题时,没有LSTM那么好。
auto-encoder-decoder的特点是输出的单元数是固定的。对于一般自然语言处理,例如机器翻译,输入的单元个数跟输出单元的个数并不是一一对应的,此时就需要动态的生成输出单元。Seq2Seq通过动态的输出结束符,代表是否输出完成,达到可以动态的根据输入输出不同的单元个数。
seq2seq的缺点是,所有的输入序列都转化为单一的单元c,导致很多信息都将消失,对于不同的输出yi,它可能依赖的输入xj有可能不一样,此时通过加入注意力模型,通过对xi进行softmax处理,并加入到y权重的训练中,可以让不同的y,有不同的x对它进行影响
softmax的输入为输入单元x,和上一个输出单元y,联合产生softmax的权重,进而对不同的序列,对于同一个x,会有不同的注意力到输出
q = Wq(x)
k = Wk(x)
v = Wv(x)
x为词向量
通过训练,得到权重w,从而学习到这一层的softmax注意力参数
R是前一次encoder的输出
通过增加w的数量,产生多个z,并进行堆叠,通过前馈网络,最后产生z
在使用self attention处理句子时,是没有考虑单词在句子中的位置信息的。为了让模型可以加入考虑单词的位置信息,加入了位置编码的向量
计算如下:
pos为单词在句子中的位置
i为词向量的位置
d为句子的长度
位置编码加上词向量形成tranformer的输入
加入了归一化和残差网络
最终通过softmax,输出每个单词的概率,并最终输出单词
⑷ 计算机是有许多逻辑门电路和一些电子元件组成的,不同硬件组成的计算机有不同的指令集,这一指令集可以用
理解有问题啊。
“比如,下面这些数字就是存放在内存中的8086指令B8 3F 00 01 C3 01 C1”,其中“B8 3F 00 01 C3 01 C1”就已经是机器语言了,之所以用十六进制而不是二进制,只是一个表达方便的问题,在存储器中,肯定是二进制的。
当你用高级语言写好程序后,然后用编译器(编译原理比较高深,主要就是一个源代码识别和源代码-高级语言与低级代码之间的转换,最终的低级代码就是机器语言,究竟一条二进制机器码代表什么由硬件设计决定。基本可以说写一个XX编译器,就算诞生了XX语言)与链接器翻译成可执行文件(所谓文件,就是有一定的格式,因此它并非所有的内容都是二进制指令了。不过,这个自有操作系统能够识别出哪些是指令)。运行可执行文件的时候,操作系统根据自己的机制,加载数据到内存。其中的指令,当被送入指令寄存器的时候,由硬件分解(翻译)指令,生成执行这个指令所应该有的所有电信号(这是硬件设计决定的,建议去了解一下时序电路)。当然,操作系统的所有动作,归根结底还是硬件实现的,这个你得了解计算机的硬件与软件究竟是如何结合的。
建议你看看《计算机原理》、《计算机接口技术》(或者51单片机原理)、《数字电路》(了解一下时序电路,这是计算机硬件实现的关键)、《脉冲电路》(仅仅了解一下触发器、门电路即可,有助于对打破砂锅问到底者的满足)、《操作系统原理》(关键点是了解软硬在那一刹那是如何结合的。这里很有哲学之美。),要深刻理解软硬的结合,还建议你了解PE结构、学习反汇编、手工汇编,《深入理解计算机系统》这书不错。
⑸ 数据挖掘主要涉及到哪些方面的知识
与数据挖掘相关的内容包括数据库、数据仓库、机器学习、信息检索。
学习数据挖掘基础:数据库理论、数学基础(包括数理统计、概率、图论等)、熟练掌握一种编程语言(java,python)、会使用数据挖掘工具软件(weka、matlab、spss)
数据挖掘的内容包括分类、关联分析、聚类和异常检测等几个方面
⑹ 请问那位高人有关于人脸识别lda算法的实例,带图片库最好,谢谢
原代码可以在这里下载。论文原作者David Blei用C写的。
lda-c.tgz载下来解压,用make编译,生成lda可执行程序。
lda est [initial alpha] [k] [settings] [data] [random/seeded/*] [directory]
lda inf [settings] [model] [data] [name]
第一个命令是模型生成的部分。est就是estimate
第二个命令是推理部分。inf就是inference
主函数在lda-estimate.c里。
readme.txt里的模型描述:
LDA is a hierarchical probabilistic model of documents. Let \alpha be a scalar and \beta_{1:K} be K distributions of words (called "topics"). As implemented here, a K topic LDA model assumes the following generative process of an N word document:
1. \theta | \alpha ~ Dirichlet(\alpha, ..., \alpha)
2. for each word n = {1, ..., N}:
a. Z_n | \theta ~ Mult(\theta)
b. W_n | z_n, \beta ~ Mult(\beta_{z_n})
This code implements variational inference of \theta and z_{1:N} for a document, and estimation of the topics \beta_{1:K} and Dirichlet parameter \alpha.
从前面一篇文章可知K是一个选取的参数表示topic的个数(在代码里用变量NTOPICS表示),\alpha是Dirichlet分布的参数,本来是一个k维向量,但是这里把它定义为标量,用一个值表示。在lda est命令里会给出一个初始的\alpha值,程序会根据训练数据求出最终的\alpha和\beta值,\beta值在上一篇文章中已经解释: β是一个k*V的矩阵。k就是主题个数,V是词语个数。计算模型实际上就是估算α和β的值。
lda est另外几个参数的解释。
setting: 配置文件,格式如下:
var max iter [integer e.g., 10 or -1]
var convergence [float e.g., 1e-8]
em max iter [integer e.g., 100]
em convergence [float e.g., 1e-5]
alpha [fit/estimate]
var max iter: 对于每一个文档的最大迭代次数,-1就是不限制,用收敛准则去判断是否停止迭代。
var convergence: 参数估计的收敛准则,当(score_old - score) / abs(score_old)小于设定值(或者迭代次数达到最大值)时,停止迭代
em max iter: EM最大迭代次数
em convergence: EM收敛准则
alpha: fit表示迭代过程中\alpha值保持不变,estimate表示\alpha值也会计算
data: 数据文件(数据格式在后面讲到)
random/seeded/*: 模型初始化参数,就是\beta矩阵的初始化。random就是用随机变量初始化,seeded就是随机抽取一个文档用平滑方法得到。*表示从已有的模型里载入。代码里涉及到一个概念:sufficient statistics(充分统计量),用结构体lda_suffstats存储,里面有一个k*V的二维数组class_word,不知道跟lda_model结构里的log_prob_w(也是k*V的二维数组)是什么关系。此处存疑。
directory: 输出目录
这里 有一个简单的语料库。载下来解压到lda程序所在目录。
然后运行如下命令
./lda 1 10 settings.txt ap/ap.dat random output
大概跑10来分钟