将python算法转为scala_将Python转换为scalaasp
我有一个Python代码,我想把它转换成Scala Spark,我的算法是LDA(潜在Dirichlet Allocation)的扩展,因为这个算法有一个采样过程,当数据非常大时非常耗时,我知道SparkMlib中有一个LDA的实现版本,但是我想单独编写我的算法再加上一些改进,我的代码是:def init_est(self):
self.nd = [0 for x in xrange(self.dset.M)]
self.ndl = [[0 for y in xrange(self.sentinum)] for x in xrange(self.dset.M)]
self.ndlz = [[[0 for z in xrange(self.K)] for y in xrange(self.sentinum)] for x in xrange(self.dset.M)]
self.nlzw = [[[0 for z in xrange(self.dset.V)] for y in xrange(self.K)] for x in xrange(self.sentinum)]
self.nlz = [[0 for y in xrange(self.K)] for x in xrange(self.sentinum)]
self.p = [[0.0 for y in xrange(self.K)] for x in xrange(self.sentinum)]
self.Z = [ [] for x in xrange(self.dset.M)]
self.L = [ [] for x in xrange(self.dset.M)]
self.pi_dl = [[0 for y in xrange(self.sentinum)]for x in xrange(self.dset.M)]
self.theta_dlz= [[[0 for z in xrange(self.K)]for y in xrange(self.sentinum)]for x in xrange(self.dset.M)]
self.phi_lzw = [[[0 for z in xrange(self.dset.V)]for y in xrange(self.K)]for x in xrange(self.sentinum)]
self.alpha_lz = [[0 for y in xrange(self.K)]for x in xrange(self.sentinum)]
self.alphaSum_l = [0 for x in xrange(self.sentinum)]
self.beta_lzw = [[[0 for z in xrange(self.dset.V)]for y in xrange(self.K)]for x in xrange(self.sentinum)]
self.betaSum_lz = [[0 for y in xrange(self.K)]for x in xrange(self.sentinum)]
self.lambda_lw = [[0 for y in xrange(self.dset.V)]for x in xrange(self.sentinum)]
self.gama_dl = [[0 for y in xrange(self.sentinum)]for x in xrange(self.dset.M)]
self.gamaSum_d = [0 for x in xrange(self.dset.M)]
for x in xrange(self.dset.M):
self.Z[x] = [0 for y in xrange(self.dset.docs[x].length)]
self.L[x] = [0 for y in xrange(self.dset.docs[x].length)]
for y in xrange(self.dset.docs[x].length):
topic = random.randint(0, self.K-1)
self.Z[x][y] = topic
sentiment = random.randint(0,self.sentinum-1)
for i in xrange(len(self.sdset.sentiLex)):
if (self.dset.id2word[self.dset.docs[x].words[y]]) == self.sdset.sentiLex[i][0]:
sentiment = self.sdset.sentiLex[i][1]
#print sentiment
self.L[x][y] = sentiment
self.nd[x] +=1
self.ndl[x][sentiment] +=1
self.ndlz[x][sentiment][topic] +=1
self.nlzw[sentiment][topic][self.dset.docs[x].words[y]] +=1
self.nlz[sentiment][topic] +=1
def estimate(self):
print 'Sampling %d iterations!' % self.iter_num
for x in xrange(self.iter_num):
print 'Iteration %d ...' % (x+1)
for i in xrange(len(self.dset.docs)):
for j in xrange(self.dset.docs[i].length):
lst = self.sampling(i, j)
sentiment = lst[0]
topic = lst[1]
self.Z[i][j] = topic
self.L[i][j] = sentiment
if (self.updateParaStep > 0 ) & (x % self.updateParaStep == 0):
self.updateParameters()
if (self.savestep > 0) & (x % self.savestep == 0):
if (x == self.iter_num):
break
print 'Saving the model at iteration...'
self.compute_theta()
self.compute_phi()
self.compute_Pi()
self.save_model()
def sampling(self, i, j):
sentiment = self.L[i][j]
topic = self.Z[i][j]
wid = self.dset.docs[i].words[j]
self.nd[i] -=1
self.ndl[i][sentiment] -=1
self.ndlz[i][sentiment][topic] -=1
self.nlzw[sentiment][topic][wid] -=1
self.nlz[sentiment][topic] -=1
for l in xrange(self.sentinum):
for k in xrange(self.K):
self.p[l][k] = (self.nlzw[l][k][wid] + self.beta_lzw[l][k][wid])/(self.nlz[l][k] + self.betaSum_lz[l][k]) * \
(self.ndlz[i][l][k] + self.alpha_lz[l][k])/(self.ndl[i][l] + self.alphaSum_l[l]) * \
(self.ndl[i][l] + self.gama_dl[i][l])/(self.nd[i] + self.gamaSum_d[i])
for l in xrange(self.sentinum):
for k in xrange(self.K):
if k==0:
if l==0:
continue
else:
self.p[l][k] = self.p[l][k] + self.p[l-1][self.K-1]
else:
self.p[l][k] = self.p[l][k] + self.p[l][k-1]
flag= False
u = random.uniform(0, self.p[self.sentinum-1][self.K-1])
for sentiment in xrange(self.sentinum):
for topic in xrange(self.K):
if self.p[sentiment][topic]>u:
flag = True
break
if flag == True:
break
self.nd[i] +=1
self.ndl[i][sentiment] +=1
self.ndlz[i][sentiment][topic] +=1
self.nlzw[sentiment][topic][wid] +=1
self.nlz[sentiment][topic] +=1
z=[sentiment,topic]
return z
def compute_theta(self):
for m in xrange(self.dset.M):
for l in xrange(self.sentinum):
for z in xrange(self.K):
self.theta_dlz[m][l][z] = (self.ndlz[m][l][z] + self.alpha_lz[l][z]) \
/(self.ndl[m][l] + self.alphaSum_l[l])
def compute_phi(self):
for l in xrange(self.sentinum):
for z in xrange(self.K):
for r in xrange(self.dset.V):
self.phi_lzw[l][z][r] = (self.nlzw[l][z][r]+ self.beta_lzw[l][z][r])\
/(self.nlz[l][z] + self.betaSum_lz[l][z])
def compute_Pi(self):
for m in xrange(self.dset.M):
for l in xrange(self.sentinum):
self.pi_dl[m][l] = (self.ndl[m][l]+self.gama_dl[m][l])\
/(self.nd[m]+self.gamaSum_d[m])
def readtrnfile():
print 'Reading train data...'
with open(trnfile, 'r') as f:
docs = f.readlines()
dset = dataset()
items_idx = 0
for line in docs:
if line not in [""," ","\n"] :
tmp = line.strip().split()
# Generate a document object
doc = Document()
for item in tmp:
if dset.word2id.has_key(item):
doc.words.append(dset.word2id[item])
else:
dset.word2id[item] = items_idx
dset.id2word[items_idx] = item
doc.words.append(items_idx)
items_idx += 1
doc.length = len(tmp)
dset.docs.append(doc)
else:
pass
dset.M = len(dset.docs)
dset.V = len(dset.word2id)
print 'There are %d documents' % dset.M
print 'There are %d items' % dset.V
print 'Saving wordmap file...'
dset.writewordmap()
return dset
def readsentifile():
print 'Reading sentimen data...'
with open(sentifile, 'r') as s:
senti = s.readlines()
SL=[]
sdset = SDataset()
for line in senti:
if line != "":
tmp = line.strip().split()
sdoc = SDocument()
golabi=tmp[0]
hasan=[tmp[1],tmp[2],tmp[3]]
mval = max(hasan)
midx = hasan.index(mval)
s=[golabi,midx,mval]
sdset.sentiLex.append(s)
else:
pass
sdoc.length = len(sdset.sentiLex)
return sdset
def lda():
dset = readtrnfile()
sdset = readsentifile()
model = Model(dset,sdset)
model.init_est()
model.estimate()
if __name__=='__main__':
lda()
我在scala和for loop中实现3D矩阵时遇到了一些问题,比如我想把数据分到不同的处理器上,每个处理器都有自己的采样(for loop)过程,采样后必须更新一些全局变量,在这里对我来说,代码的简单性和可理解性比优化和高缩短时间更重要,Mlib实现是基于Graphx的,非常难以理解。在
有什么解决办法吗?在
将python算法转为scala_将Python转换为scalaasp相关推荐
- python csv转为html,在Python中将CSV转换为HTML表格
首先安装熊猫: pip install pandas 然后运行: import pandas as pd columns = ['age', 'week', 'opp', 'ACscr', 'OPPs ...
- python算发必须有输出吗_数据时代为什么一定要学python+算法?
感觉目前很多家长还是很有前瞻目光,小学的时候就让孩子学习python+算法,以前总感觉英语(和外国人沟通)很重要,但是现在感觉编程(和计算机沟通)更重要,现在计算机已经无处不在,伴随着人工智能的进一步 ...
- python编程300集免费-python 300本电子书合集
链接: https://pan.baidu.com/s/1CNlB35ASnDNlUGNCZJbiAA 提取码: fxig Q群:592857363 更多所在 数据科学速查表 零起点Python机器学 ...
- 相似图片检测:感知哈希算法之dHash的Python实现
原文:https://blog.csdn.net/haluoluo211/article/details/52769325 相似图片检测:感知哈希算法之dHash的Python实现 某些情况下,我们需 ...
- Python算法题笔记
Python算法题笔记 这是本人在学Python和算法题时做的笔记,包含一些Python的典型写法,有用的轮子调用,希望对大家有帮助. 分为三个部分,Python笔记,算法,经典题目,其中Python ...
- 编辑距离算法详解和python代码
编辑距离(Levenshtein Distance)算法详解和python代码 最近做NLP用到了编辑距离,网上学习了很多,看到很多博客写的有问题,这里做一个编辑距离的算法介绍,步骤和多种python ...
- Python可以调用Gpu吗_加快Python算法的四个方法:Numba篇
CDA数据分析师 出品 相信大家在做一些算法经常会被庞大的数据量所造成的超多计算量需要的时间而折磨的痛苦不已,接下来我们围绕四个方法来帮助大家加快一下Python的计算时间,减少大家在算法上的等待时间 ...
- 一文读懂FM算法优势,并用python实现
介绍 我仍然记得第一次遇到点击率预测问题时的情形,在那之前,我一直在学习数据科学,对自己取得的进展很满意,在机器学习黑客马拉松活动中也开始建立了自信,并决定好好迎接不同的挑战. 为了做得更好,我购买了 ...
- 机器学习经典算法具体解释及Python实现--K近邻(KNN)算法
(一)KNN依旧是一种监督学习算法 KNN(K Nearest Neighbors,K近邻 )算法是机器学习全部算法中理论最简单.最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值 ...
最新文章
- 为Openshift + MongoDb应用程序编写验收测试
- c# 多线程实现ping 多线程控制控件
- JAVA笔记--数组和字符串常用方法
- 冰城环保进入智慧时代
- 英语发音规则---A字母
- vscode调试typescript
- AttributeError: module ‘tensorflow‘ has no attribute ‘ConfigProto‘
- Ubuntu 12.04 下安装 Eclipse
- android 电视安装apk文件损坏,安装电视软件时提示解析包出现问题怎么破?
- java 打印 xps_使用Java 将PPT转换为PDF、XPS等格式
- bootloader系列二——arm920t--bootloader架构设计
- 圆周率小数点后1千位(附计算圆周率源代码)
- 读光驱时,提示“无法访问,函数不正确”错误提示
- 网络攻防技术(摆烂一天)
- java lint_Android静态代码检查-Lint
- 74HC161异步计数器仿真示例
- Excel | 替换特定大小的单元格值(如:小于5000的值)为指定值
- Ubuntu16.04系统nvidia显卡上图形界面及OpenGL环境搭建心得
- Duplicate entry ‘XXX‘ for key ‘XXX.PRIMARY‘解决方案。
- Google Net变种以及注意力机制
热门文章
- android-6.0 新功能介绍(Marshmallow)
- android studio下生成aar文件,本地调用
- win10的11对战平台突然无法启动魔兽
- 怎么将pom文件mysql驱动修改版本_JDBC-MySql基础操作详解
- android应用自动打开网页,Android 使用Scheme实现从网页启动APP
- java final 变量 好处_深入理解Java中的final关键字
- 删除mysql 执行计划_如何清除某条SQL的执行计划
- [洪流学堂]Hololens开发高级篇2:手势(Gesture)
- vue 保存时清空iuput_Vue 一键清空表单的实现方法
- (三)混合边缘AI人脸对齐