Download as pdf or txt
Download as pdf or txt
You are on page 1of 11

Міністерство освіти та науки України

Харківський національний університет радіоелектроніки

Лабораторна робота №1
з дисципліни: «Інтелектуальний аналіз даних»
на тему: «НАЇВНИЙ БАЄСІВ КЛАСИФІКАТОР З
ВІЗУАЛІЗАЦІЄЮ РЕЗУЛЬТАТУ РОБОТИ АЛГОРИТМУ»

Виконав
ст. групи ПЗПІ-17-1
Макєєв О.С.

Перевірив
асистент Данієль Я. Д.

Харків 2020
Мета роботи

Ознайомитись з поняттям та задачею класифікації. Ознайомитись з


наївним баєсовим класифікатором та особливостями його застосування.

Хід роботи

Було обрано 15 варіант. 15 варіант містив такі слова: телефонія, тварини,


електроенергія.
До розробки програмного забезпечення було написано навчальні фрази
для «спам»/ «не спам».
В таблиці 1 написані навчальні фрази для класу «не спам».

Таблиця 1 – Навчальні фрази «не спам»


№ Фраза
1 При збільшенні кількості дзвінків з телефонії збільшується витрача
електроенергії
2 При збільшенні тварин збільшуєтьсся витрата на електроенергії
3 При збільшенні тварин збільшується кількість заохочих дізнатись про
них, що збільшує кількість дзвінків по телефонії
4 Збільшення оплати електроенергії в наступному місяці
5 Тварини - помічники людини
6 Твори про тварин
7 Кішки - це тварини
8 Телефонія
9 Телефонія найкращий спосіб, щоб зв'язатися з друзями
10 В зоопарк привезли нових тварин. Дізнатись можна по телефонії
11 За останній місяць тварин отоплювали багато, що призвело до
збільшення електроенергії
12 Історія розвитку телефонії у світі
13 Історія розвитку телефонії в Україні
14 Тарифи на електроенергію в 2021 році
15 Генерування електроенергії
16 Генерування електроенергії — процес перетворення різних видів енергії
в електричну на індустріальних об'єктах, що називаються електричними
станціями.
17 Тарифи на розподіл електроенергії для підприємств
18 Електроенергія — вид енергії, що існує у вигляді потенціальної енергії
електричного й магнітного полів та енергії електричного струму.

В таблиці 2 написані навчальні фрази для класу «спам».

Таблиця 2 - Навчальні фрази «спам»


№ Фраза
1 Безкоштовна телефонія
2 Акція на електроенергію
3 Акція на телефонію
4 Знижка на телефонію
5 Безкоштовні тварини
6 Знижка на електроенергію
7 Безлімітна телефонія
8 Ви переможець, тому ви отримуете місяць безкоштовної телефонії
9 Мінімальний платіж за електроенергію
10 Не проходьте повз тварин
11 Безкоштовні дзвінки по телефонії, якщо ви берете по акції
електроенергію
12 Пропозиція обмежена на електроенергію!
13 Актуальні тарифи на електроенергію на Minfin.com.ua
14 Ціна на електроенергію для населення зросла з 1 січня
15 Електроенергія для населення відсьогодні подорожчала через єдиний
тариф – 1,68 грн/кВт-год

Після складання навчальних фраз були написані вже реальні дані як


показано в таблиці 3.

Таблиця 3 – Реальні дані


№ Фраза
1 Акція на смартфон
2 Акція на тварин
3 Акція на електроенергію
4 Безкоштовна електроенергія
5 Безкоштовні тварини
6 Знижка на телефонію
7 Знижка на тварин
8 Пропозиція по телефонії
9 Гарні тварини
10 Тарифи на розподіл електроенергії для підприємств
11 Тарифи на розподіл електроенергії
12 Історія розвитку телефонії
13 Тварини
14 Телефонія без слів

Наступним кроком була розробка програмного забезпечення, яке


використовуватиме наївний баєсовський класифікатор.
Було створено клас NaiveBayes которий має 2 основних методи: learn для
навчання та categorize для перевірки реальних даних.

export class NaiveBayes {


constructor(options) {
if (typeof options !== 'undefined') {
if (!options || typeof options !== 'object' ||
Array.isArray(options)) {
throw TypeError('NaiveBayes got invalid
`options`: `' + options + '`. Pass in an object.')
}
this.options = options
} else {
this.options = {}
}
this.tokenizer = this.options.tokenizer ||
defaultTokenizer
this.vocabulary = {}
this.vocabularySize = 0
this.totalDocuments = 0
this.docCount = {}
this.wordCount = {}
this.wordFrequencyCount = {}
this.categories = {}
}
async initializeCategory(categoryName) {
if (!this.categories[categoryName]) {
this.docCount[categoryName] = 0
this.wordCount[categoryName] = 0
this.wordFrequencyCount[categoryName] = {}
this.categories[categoryName] = true
}
return this
}
async learn(text, category) {
const self = this
await self.initializeCategory(category)
self.docCount[category]++
self.totalDocuments++
const tokens = await self.tokenizer(text)
const frequencyTable = self.frequencyTable(tokens)
Object
.keys(frequencyTable)
.forEach(function (token) {
if (!self.vocabulary[token]) {
self.vocabulary[token] = true
self.vocabularySize++
}
const frequencyInText = frequencyTable[token]
if
(!self.wordFrequencyCount[category][token]) {
self.wordFrequencyCount[category][token] =
frequencyInText
} else {
self.wordFrequencyCount[category][token] +=
frequencyInText
}
self.wordCount[category] += frequencyInText
})
return self
}
async categorize(text) {
let self = this
, maxProbability = -Infinity
, chosenCategory = null
const tokens = await self.tokenizer(text)
const frequencyTable = self.frequencyTable(tokens)
Object.keys(self.categories).forEach(function
(category) {
const categoryProbability =
self.docCount[category] / self.totalDocuments
let logProbability = Math.log(categoryProbability)
Object
.keys(frequencyTable)
.forEach(function (token) {
const frequencyInText =
frequencyTable[token];
const tokenProbability =
self.tokenProbability(token, category);
logProbability += frequencyInText *
Math.log(tokenProbability)
})
if (logProbability > maxProbability) {
maxProbability = logProbability
chosenCategory = category
}
})
return chosenCategory
}
tokenProbability(token, category) {
const wordFrequencyCount =
this.wordFrequencyCount[category][token] || 0;
const wordCount = this.wordCount[category];
return (wordFrequencyCount + 1) / (wordCount +
this.vocabularySize)
}
frequencyTable(tokens) {
const frequencyTable = Object.create(null);
tokens.forEach(function (token) {
if (!frequencyTable[token]) {
frequencyTable[token] = 1
} else {
frequencyTable[token]++
}
})
return frequencyTable
}
toJson() {
const state = {};
const self = this;
STATE_KEYS.forEach(key => state[key] = self[key]);
return JSON.stringify(state)
}
}
export function fromJson(jsonStr) {
let parsed;
try {
parsed = JSON.parse(jsonStr)
} catch (e) {
throw new Error('fromJson expects a valid JSON
string.')
}
const classifier = new NaiveBayes(parsed.options);
STATE_KEYS.forEach((key) => {
if (typeof parsed[key] === 'undefined' || parsed[key]
=== null) {
throw new Error(`fromJson: JSON string is missing
an expected property: ${key}.`)
}
classifier[key] = parsed[key]
})
return classifier
}
На рисунку 1 зображено використання learn методу для навчання «не
спам» класу.

Рисунок 1 – Використання learn методу для навчання «не спам» класу

На рисунку 2 зображено використання learn методу для навчання «спам»


класу.

Рисунок 2 – Використання learn методу для навчання «спам» класу


На рисунку 3 зображено результат реальних даних з таблиці 3.

Рисунок 3 – Результат реальних даних

Висновок

В лабораторній роботі було розроблено програмне забезпечення.


Програмне забезпечення основане на наївному баєсовому класифікатору для
перевірки електронних листів на «спам»/ «не спам».

Контрольні запитання

1. Що таке класифікація даних?


Класифікація даних – формалізована задача, яка містить множину
об'єктів (ситуацій), поділених певним чином на класи.
2. Що таке наївний баєсів класифікатор?
Наївний баєсів класифікатор – ймовірнісний класифікатор, що
використовує теорему Баєса для визначення ймовірності приналежності
спостереження (елемента вибірки) до одного з класів при припущенні
(наївному) незалежності змінних.
3. Наведіть 5 прикладів використання наївного баєсового класифіктору.
- Фільтрація спаму
- визначення тональності документа
- виявлення расизму у текстовій виборці
- аналіз емоційного забарвлення текстів
- системи обробки інформації
4. Чому баєсів класифікатор є «наївним»?
Використовує незалежні дані та робить припущення, що дані сумісні
між собою.
5. Опишіть переваги наївного баєсового класифікатору.
Перевагою є те, що вимоги до розміру вибірки скорочуються від
експоненційних до лінійних.
6. Опишіть недоліки наївного баєсового класифікатору.
Недолік — те, що модель є точною лише у випадку, коли виконується
припущення про незалежність.

You might also like