English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Estimación de Naive Bayes
El Naive Bayes es un método de clasificación basado en el teorema de Bayes y la hipótesis de distribución de independencia condicional de características. Primero, aprende el input basándose en la hipótesis de independencia condicional de características/La distribución de probabilidad conjunta resultante, luego basándose en este modelo, para obtener la probabilidad posterior máxima del input x dado, utilizando el teorema de Bayes.
En términos específicos, según el conjunto de datos de entrenamiento, aprender la distribución de estimación máxima verosimilitud de la probabilidad a priori.
y la probabilidad condicional es
Xl representa el l-ésimo característica, dado que se asume que las características son independientes, se puede obtener
La estimación máxima verosimilitud de la probabilidad condicional es
De acuerdo con el teorema de Bayes
entonces se puede obtener la probabilidad condicional P(Y=ck|X=x) a partir de la ecuación anterior.
Estimación Bayesiana
El uso de la estimación máxima verosimilitud puede llevar a que la probabilidad estimada sea 0. Esto puede afectar el cálculo de la probabilidad posterior y hacer que la clasificación tenga sesgo. Se utiliza el siguiente método para resolverlo.
La probabilidad condicional Bayesiana se cambia por
donde Sl representa el número de posibles valores del l-ésimo característica.
Del mismo modo, la estimación Bayesiana de la probabilidad a priori se cambia por
$$
P(Y=c_k) = \frac{\sum\limits_{i=1}^NI(y_i=c_k)+\lambda}{N+K\lambda}
$K$
representa el número de posibles valores de Y, es decir, el número de tipos.
Específicamente, inicializar la frecuencia de aparición de cada posibilidad en1para asegurar que cada posibilidad haya aparecido al menos una vez, para resolver el caso de estimación a 0.
Clasificación de texto
El clasificador Bayesiano puro puede proporcionar una estimación de valor de predicción más probable y una probabilidad de estimación. Se utiliza generalmente para la clasificación de texto.
La idea central de la clasificación es seleccionar la categoría con la probabilidad más alta. La fórmula de Bayes es la siguiente:
Término: Usar la frecuencia de aparición de cada palabra como característica.
Supongamos que cada característica es independiente, es decir, cada palabra es independiente e irrelevante. Entonces
El código completo es el siguiente;
importar numpy como np importar re importar feedparser importar operador def cargarDataSet(): postingList=[['mi', 'perro', 'tiene', 'problemas', 'con', 'las', 'pulgas', 'ayuda', 'por', 'favor'], ['tal vez', 'no', 'llevarlo', 'al', 'parque', 'de', 'perros', 'estúpido'], ['mi', 'dalmatense', 'es', 'tan', 'lindo', 'lo', 'amo'], ['detener', 'publicar', 'estúpido', 'inútil', 'basura'], ['el', 'se', 'come', 'mi', 'filete', 'cómo', 'detenerlo'], ['salir', 'comprar', 'inútil', 'perro', 'alimento', 'estúpido'] classVec = [0,1,0,1,0,1]1 is abusive, 0 not return postingList,classVec def createVocabList(data): #创建词向量 returnList = set([]) for subdata in data: returnList = returnList | set(subdata) return list(returnList) def setofWords2Vec(vocabList,data): #将文本转化为词条 returnList = [0]*len(vocabList) for vocab in data: if vocab in vocabList: returnList[vocabList.index(vocab)] += 1 return returnList def trainNB0(trainMatrix,trainCategory): #训练,得到分类概率 pAbusive = sum(trainCategory)/len(trainCategory) p1num = np.ones(len(trainMatrix[0])) p0num = np.ones(len(trainMatrix[0])) p1Denom = 2 p0Denom = 2 for i in range(len(trainCategory)): if trainCategory[i] === 1: p1num = p1num + trainMatrix[i] p1Denom = p1Denom + sum(trainMatrix[i]) else: p0num = p0num + trainMatrix[i] p0Denom = p0Denom + sum(trainMatrix[i]) p1Vect = np.log(p1num/p1Denom) p0Vect = np.log(p0num/p0Denom) return p0Vect,p1Vect,pAbusive def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1): #分类 p0 = sum(vec2Classify*p0Vec)+np.log(1-pClass1) p1 = sum(vec2Classify*p1Vec)+np.log(pClass1) if p1 > p0: return 1 else: return 0 splitdata = re.split(r'\W+',bigString) splitdata = [token.lower() for token in splitdata if len(token) > 2] return splitdata def spamTest(): docList = [] classList = [] for i in range(1,26): with open('spam/%d.txt'%i) as f: doc = f.read() docList.append(doc) classList.append(1) with open('ham/%d.txt'%i) as f: doc = f.read() docList.append(doc) classList.append(0) vocalList = createVocabList(docList) trainList = list(range(50)) testList = [] for i in range(13): num = int(np.random.uniform(0,len(docList))-10) testList.append(trainList[num]) del(trainList[num]) docMatrix = [] docClass = [] for i in trainList: subVec = setofWords2Vec(vocalList,docList[i]) docMatrix.append(subVec) docClass.append(classList[i]) p0v,p1v,pAb = trainNB0(docMatrix,docClass) errorCount = 0 for i in testList: subVec = setofWords2Vec(vocalList,docList[i]) if classList[i] != classifyNB(subVec,p0v,p1v,pAb): errorCount += 1 return errorCount/len(testList) def calcMostFreq(vocabList,fullText): count = {} for vocab in vocabList: count[vocab] = fullText.count(vocab) sortedFreq = sorted(count.items(),key=operator.itemgetter()1),reverse=True) return sortedFreq[:30] def localWords(feed1,feed0): docList = [] classList = [] fullText = [] numList = min(len(feed1['entries']),len(feed0['entries'])) for i in range(numList): doc1 = feed1['entries'][i]['summary'] docList.append(doc1) classList.append(1) fullText.extend(doc1) doc0 = feed0['entries'][i]['summary'] docList.append(doc0) classList.append(0) fullText.extend(doc0) vocabList = createVocabList(docList) top30Words = calcMostFreq(vocabList,fullText) for word in top30Words: if word[0] in vocabList: vocabList.remove(word[0]) trainingSet = list(range(2*numList)) testSet = [] for i in range(20): randnum = int(np.random.uniform(0,len(trainingSet)-5)) testSet.append(trainingSet[randnum]) del(trainingSet[randnum]) trainMat = [] trainClass = [] for i in trainingSet: trainClass.append(classList[i]) trainMat.append(setofWords2Vec(vocabList,docList[i]) p0V,p1V,pSpam = trainNB0(trainMat,trainClass) errCount = 0 for i in testSet: testData = setofWords2Vec(vocabList,docList[i]) if classList[i] != classifyNB(testData,p0V,p1V,pSpam): errCount += 1 return errCount/len(testData) if __name__=="__main__": ny = feedparser.parse('http://newyork.craigslist.org/stp/index.rss') sf = feedparser.parse('http://sfbay.craigslist.org/stp/index.rss') print(localWords(ny,sf))
Técnicas de programación:
1.Unión de dos conjuntos
vocab = vocab | set(document)
2.Crear un vector con todos los elementos en cero
vec = [0]*10
Descarga de código y conjuntos de datos:Bayes
Esto es todo el contenido del artículo, espero que sea útil para su aprendizaje y que todos apoyen a la tutorial de grito.
Declaración: El contenido de este artículo se ha obtenido de la red, es propiedad del autor original, el contenido se ha contribuido y subido por los usuarios de Internet de manera autónoma. Este sitio no posee los derechos de propiedad, no ha sido editado por humanos y no asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, reemplace # con @) para denunciar y proporcionar evidencia relevante. Una vez verificada, este sitio eliminará inmediatamente el contenido sospechoso de infracción.