Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const fs = require("fs")
- // utils
- const splitBy = del => str => str.split(del)
- const nonEmpty = el => Boolean(el)
- const atIndexEquals = (ind, value) => el => el[ind] === value
- //
- // read file
- const file = fs.readFileSync("./house-votes-84.data", "utf8")
- const data = file
- .split("\n")
- .filter(nonEmpty)
- .map(splitBy(","))
- const step = ~~(data.length / 10)
- //
- // solution
- const results = []
- for (let i = 0; i < 10; i++) {
- const testData =
- i === 9 ? data.slice(i * step) : data.slice(i * step, i * step + step)
- const trainingData = data
- .slice(0, i * step)
- .concat(data.slice(i * step + step))
- const republicans = trainingData.filter(atIndexEquals(0, "republican"))
- const democrats = trainingData.filter(atIndexEquals(0, "democrat"))
- const p_republican = republicans.length / trainingData.length
- const p_democrat = democrats.length / trainingData.length
- const attributeProbabilities = []
- // for each attribute
- for (let i = 1; i < 17; i++) {
- const p_y_republican =
- republicans.filter(atIndexEquals(i, "y")).length / republicans.length
- const p_n_republican =
- republicans.filter(atIndexEquals(i, "n")).length / republicans.length
- const p_q_republican =
- republicans.filter(atIndexEquals(i, "?")).length / republicans.length
- const p_y_democrat =
- democrats.filter(atIndexEquals(i, "y")).length / democrats.length
- const p_n_democrat =
- democrats.filter(atIndexEquals(i, "n")).length / democrats.length
- const p_q_democrat =
- democrats.filter(atIndexEquals(i, "?")).length / democrats.length
- attributeProbabilities.push({
- p_y_republican,
- p_n_republican,
- p_q_republican,
- p_y_democrat,
- p_n_democrat,
- p_q_democrat
- })
- }
- const correctAnswers = testData.filter(currTest => {
- const res = currTest[0]
- const attributes = currTest.slice(1)
- const pDemocrat = attributes.reduce(
- (acc, attr, i) =>
- attributeProbabilities[i][`p_${attr === "?" ? "q" : attr}_democrat`] *
- acc,
- p_democrat
- )
- const pRepublican = attributes.reduce(
- (acc, attr, i) =>
- attributeProbabilities[i][`p_${attr === "?" ? "q" : attr}_republican`] *
- acc,
- p_republican
- )
- const finalDecision = pDemocrat > pRepublican ? "democrat" : "republican"
- return res === finalDecision
- }).length
- const accuracy = correctAnswers / testData.length
- console.log(`Training ${i + 1}: `, accuracy)
- results.push(accuracy)
- }
- const classifierAccuracy =
- results.reduce((acc, res, i) => {
- if (i === 9) {
- return res * (data.length - 9 * step) + acc
- }
- return res * step + acc
- }, 0) / data.length
- console.log("Classifier: ", classifierAccuracy)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement