Advertisement
finalmail

naive bayes classifier

Dec 23rd, 2019
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const fs = require("fs")
  2.  
  3. // utils
  4. const splitBy = del => str => str.split(del)
  5. const nonEmpty = el => Boolean(el)
  6. const atIndexEquals = (ind, value) => el => el[ind] === value
  7. //
  8.  
  9. // read file
  10. const file = fs.readFileSync("./house-votes-84.data", "utf8")
  11. const data = file
  12.   .split("\n")
  13.   .filter(nonEmpty)
  14.   .map(splitBy(","))
  15. const step = ~~(data.length / 10)
  16. //
  17.  
  18. // solution
  19. const results = []
  20. for (let i = 0; i < 10; i++) {
  21.   const testData =
  22.     i === 9 ? data.slice(i * step) : data.slice(i * step, i * step + step)
  23.   const trainingData = data
  24.     .slice(0, i * step)
  25.     .concat(data.slice(i * step + step))
  26.  
  27.   const republicans = trainingData.filter(atIndexEquals(0, "republican"))
  28.   const democrats = trainingData.filter(atIndexEquals(0, "democrat"))
  29.  
  30.   const p_republican = republicans.length / trainingData.length
  31.   const p_democrat = democrats.length / trainingData.length
  32.  
  33.   const attributeProbabilities = []
  34.   // for each attribute
  35.   for (let i = 1; i < 17; i++) {
  36.     const p_y_republican =
  37.       republicans.filter(atIndexEquals(i, "y")).length / republicans.length
  38.     const p_n_republican =
  39.       republicans.filter(atIndexEquals(i, "n")).length / republicans.length
  40.     const p_q_republican =
  41.       republicans.filter(atIndexEquals(i, "?")).length / republicans.length
  42.     const p_y_democrat =
  43.       democrats.filter(atIndexEquals(i, "y")).length / democrats.length
  44.     const p_n_democrat =
  45.       democrats.filter(atIndexEquals(i, "n")).length / democrats.length
  46.     const p_q_democrat =
  47.       democrats.filter(atIndexEquals(i, "?")).length / democrats.length
  48.  
  49.     attributeProbabilities.push({
  50.       p_y_republican,
  51.       p_n_republican,
  52.       p_q_republican,
  53.       p_y_democrat,
  54.       p_n_democrat,
  55.       p_q_democrat
  56.     })
  57.   }
  58.  
  59.   const correctAnswers = testData.filter(currTest => {
  60.     const res = currTest[0]
  61.     const attributes = currTest.slice(1)
  62.  
  63.     const pDemocrat = attributes.reduce(
  64.       (acc, attr, i) =>
  65.         attributeProbabilities[i][`p_${attr === "?" ? "q" : attr}_democrat`] *
  66.         acc,
  67.       p_democrat
  68.     )
  69.     const pRepublican = attributes.reduce(
  70.       (acc, attr, i) =>
  71.         attributeProbabilities[i][`p_${attr === "?" ? "q" : attr}_republican`] *
  72.         acc,
  73.       p_republican
  74.     )
  75.     const finalDecision = pDemocrat > pRepublican ? "democrat" : "republican"
  76.  
  77.     return res === finalDecision
  78.   }).length
  79.   const accuracy = correctAnswers / testData.length
  80.  
  81.   console.log(`Training ${i + 1}: `, accuracy)
  82.  
  83.   results.push(accuracy)
  84. }
  85.  
  86. const classifierAccuracy =
  87.   results.reduce((acc, res, i) => {
  88.     if (i === 9) {
  89.       return res * (data.length - 9 * step) + acc
  90.     }
  91.  
  92.     return res * step + acc
  93.   }, 0) / data.length
  94. console.log("Classifier: ", classifierAccuracy)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement