我正在使用 Golang 为具有超过 30000 个可能标签的数据集实现朴素贝叶斯分类。我已经建立了模型,我正处于分类阶段。我正在对 1000 条记录进行分类,这最多需要 5 分钟。我已经使用 pprof 功能对代码进行了分析;前 10 名如下所示:
Total: 28896 samples
16408 56.8% 56.8% 24129 83.5% runtime.mapaccess1_faststr
4977 17.2% 74.0% 4977 17.2% runtime.aeshashbody
2552 8.8% 82.8% 2552 8.8% runtime.memeqbody
1468 5.1% 87.9% 28112 97.3% main.(*Classifier).calcProbs
861 3.0% 90.9% 861 3.0% math.Log
435 1.5% 92.4% 435 1.5% runtime.markspan
267 0.9% 93.3% 302 1.0% MHeap_AllocLocked
187 0.6% 94.0% 187 0.6% runtime.aeshashstr
183 0.6% 94.6% 1137 3.9% runtime.mallocgc
127 0.4% 95.0% 988 3.4% math.log10
令人惊讶的是,地图访问似乎是瓶颈。有没有人经历过这个。还有什么其他的键值数据结构可以用来避免这个瓶颈?所有地图访问都在下面给出的以下代码段中完成:
func (nb *Classifier) calcProbs(data string) *BoundedPriorityQueue{
probs := &BoundedPriorityQueue{}
heap.Init(probs)
terms := strings.Split(data, " ")
for class, prob := range nb.classProb{
condProb := prob
clsProbs := nb.model[class]
for _, term := range terms{
termProb := clsProbs[term]
if termProb != 0{
condProb += math.Log10(termProb)
}else{
condProb += -6 //math.Log10(0.000001)
}
}
entry := &Item{
value: class,
priority: condProb,
}
heap.Push(probs,entry)
}
return probs
}
映射是 nb.classProb,map[string]float64而 nb.model 是类型的嵌套映射
map[string]map[string]float64
米脂
相关分类