C++ Tutorial Index

C++ Tutorial C++ History C++ Installation C++ First Program C++ cin and cout C++ Data type C++ Variable C++ operator C++ Keywords

C++ Control Statements

C++ If C++ Nested if C++ If-else C++ If-else-if C++ Switch C++ Break C++ Continue C++ Goto C++ For loop C++ While loop C++ Do while loop

C++ Functions

C++ Call by Value C++ Call by Reference C++ Recursion Function C++ Inline function C++ Friend function

C++ Arrays

Single dimension array Two dimension array

C++ Strings

C++ Strings

C++ Inheritance

C++ Inheritance Single level Inheritance Multilevel Inheritance Multiple Inheritance Hierarchical Inheritance Hybrid Inheritance

C++ Polymorphism

C++ Polymorphism C++ Overloading C++ Overriding C++ Virtual Function

C++ Pointers

C++ Pointers C++ this pointer

C++ Exception Handling

C++ Exception Handling

C++ Constructors

C++ Constructors Default Constructor Parameterize Constructor Copy constructor Constructor Overloading Destructor

C++ File Handling

C++ File Handling C++ Writing to file C++ Reading file C++ Close file

Miscellaneous

C Vs C++ C++ Comments C++ Data Abstraction C++ Identifier C++ Memory Management C++ Storage Classes C++ Void Pointer C++ Array To Function C++ Expressions C++ Features C++ Interfaces C++ Encapsulation std::min in C++ External merge sort in C++ Remove duplicates from sorted array in C++ Precision of floating point numbers Using these functions floor(), ceil(), trunc(), round() and setprecision() in C++ C++ References C++ Friend Functions C++ Mutable keyword Unary Operators in C++ Initialize Array of objects with parameterized constructors in C++ Differences between #define & const in C/C++ C++ Program to Implement Shell Sort C++ Program to Implement Merge Sort Storage Classes in C Vector resize() in C++ Passing by Reference Vs. Passing by the pointer in C++ Free vs delete() in C++ goto statement in C and C++ C++ program to read string using cin.getline() C++ String Concatenation Heap Sort in C++ Swap numbers in C++ Input Iterators in C++ Fibonacci Series in C++ C ++ Program: Alphabet Triangle and Number Triangle C++ Program: Matrix Multiplication C++ Program to Print Fibonacci Triangle Stack in C++ Maps in C++ Queue in C++ C++ Bitset C++ Algorithms Priority Queue in C++ C++ Multimap C++ Deque Function Pointer in C++ Sizeof() Operators in C++ C++ array of Pointers free() Vs delete in C Timsort Implementation Using C++ CPP Templates C++ Aggregation C++ Enumeration C++ Math Functions C++ Object Class C++ Queue Initialize Vector in C++ Vector in C++ C++ STL Components Function overloading in C++ C++ Maximum Index Problem C++ find missing in the second array C++ Program to find the product array puzzle C++ Program To Find Largest Subarray With 0 Sum C++ Program To Move All Zeros To The End Of The Array C++ Program to find the element that occurs once C++ Program to find the largest number formed from an array Constructor Vs Destructor C++ Namespaces C++ OOPs Concept C++ Static C++ Structs C++ Try-Catch C++ User Defined Exceptions C++ Virtual Destructor C++ vs C# Malloc() and new in C++ Palindrome Number Program in C++ Snake Code in C++ Splitting a string in C++ Structure Vs Class in C++ Virtual Function Vs Pure Virtual Function C++ Bidirectional Iterators C++ Forward Iterators C++ Iterators C++ Output Iterators C++ Range-based For Loop Converting string into integer in C++ LCM Program in C++ Type conversion in C++ Add two numbers using the function in C++ Advantage and disadvantage friend function C++ Armstrong Number Program in C++ ATM machine program in C++ using functions Binary to Decimal in C++ Bit Manipulation in C++ C++ Constructor C++ Dijkstra Algorithm Using the Priority Queue C++ int into String C++ Signal Handling Decimal to Binary in C++ Decimal to Hexadecimal in C++ Decimal to Octal in C++ Factorial Program in C++ Function in C++ Hexadecimal to Decimal in C++ Octal to Decimal in C++ Reverse a Number in C++ Structure Vs Class in C++ C++ Forward Iterators C++ Output Iterators C++ Prime number program Char Array to String in C++ Constructor Overloading in C++ Default arguments in C++ Different Ways to Compare Strings in C++ Dynamic Binding in C++ Program to convert infix to postfix expression in C++ SET Data Structure in C++ Upcasting and Downcasting in C++ Reverse an Array in C++ Fast Input and Output in C++ Delete Operator in C++ Copy elision in C++ C++ Date and Time C++ Bitwise XOR Operator Array of sets in C++ Binary Operator Overloading in C++ Binary Search in C++ Implementing the sets without C++ STL containers Scope Resolution Operator in C++ Smart pointers in C++ Types of polymorphism in C++ Exception Handling in C++ vs Java Const Keyword in C++ Type Casting in C++ Static keyword in C++ vs Java Inheritance in C++ vs Java How to concatenate two strings in C++ Programs to Print Pyramid Patterns in C++ swap() function in C++ Structure of C++ Program Stringstream in C++ and its applications rand() and srand() in C / C++ C++ Ternary Operator C++ Scope of Variables While Loop Examples in C++ Star pattern in C++ using For Loops For Loop Examples in C++ Do-While Loop Examples in C++ Top 5 IDEs for C++ That You Should Try Once Assertions in C/C++ C++ Convert Int to String Continue in C++ While loop Diamond Pattern in C++ using For Loop How to Reverse a String in C++ using Do-While Loop How to Reverse a String in C++ using For Loop How to Reverse a String in C++ using While Loop Infinite loop in C++ Loops in C++ Returning Multiple Values from a Function using Tuple and Pair in C++ wcscpy(), wcslen(), wcscmp() Functions in C++ Auto keyword in C++ C++ 11 vs C++ 14 vs C++ 17 C++ STL (Standard Template Library) Differences Between C Structures and C++ Structures Divide by Zero Exception in C++ Dynamic Constructor in C++ Dynamic Memory Allocation in C++ Find the Size of Array in C/C++ without using sizeof() function Floating Point Operations and Associativity in C, C++ and Java Hello World Program in C++ How to create a table in C++ How to Setup Environment for C++ Programming on Mac Implementation of a Falling Matrix in C++ Message Passing in C++ Pointer to Object in C++ Templates in C++ vs Generics in Java Ways to Copy a Vector in C++ What does Buffer Flush mean in C++ sort() function in C++ Structure Sorting (By Multiple Rules) in C++ Similarities between C++ and Java std::distance in C++ Array program in C++ C++ Tricks for Competitive Programming Desired Capabilities in Selenium Web Driver in C++ Socket Programming in C++ Template Specialization in C++ Classes and Objects in C++ Convex hull Algorithm in C++ DES in C++ C++ vardiac() function Difference between Two Sets in C++ Difference between Exit and Return Structured Binding in C++ Differences between Local and Global Variable Bitwise Operator vs Logical Operator Difference between OOP and POP in C++ Fork in C++ Functors in C++ How to call a void function in C++ How to create a directory or folder in C/C++ How to create a library in C++ How to create a stack in C++ How to create the Processes with Fork in C++ How to Handle Divide by Zero Exception in C++ Lambda Expression in C++ Pattern programs in C++ Roadmap to C++ Programming Substring in C++ Virtual base class in C++ Bits stdc++.h in C++ Top 14 Best Free C++ IDE (Editor & Compiler) for Windows in 2022 Bitmasking in C++ Auto Keyword in C++ Features of OOPS in C++ Hospital Management Project in C++ How to Declare Unordered Sets in C++ How to Sort an Array in C++ Include Guards in C++ Iostream in C++ Method overriding in C++ How to run program in turbo c++ How to Use Getline in C++ Leap Year Program in C++ Naming Convention in C++ New Operator in C++ Nullptr in C++ Object Slicing in C++ Principles of Object-Oriented Programming in C++ Processing strings using std string stream in C++ Pure Virtual Function in C++ With Example Program Random Number Generator in C++ Singleton Design Pattern in C++ Size_t Data Type in C++ Skyline Problem in C++ System() function in C++ Web Development in C++ Data Hiding in C++ Difference between exit() and _Exit() in C++ Hashing in C++ Object in C++ Sum of all Elements between k1’th and k2’th Smallest Elements Virtual class in C++ Vector Size in C++ Top best IDEs for C/C++ Developers in 2022 Tensorflow in C++ Sliding Window Technique in C++ Reverse String Word-Wise in C++ Returning a Function Pointer from a Function in C/C++ RTTI in C++ Pthreads or POSIX Threads in C++ Reserved Keywords in C++ Passing a Vector to a function in C++ 10 Best C and C++ Books for Beginners & Advanced Programmers Add two numbers represented by two arrays in C++ Array of Object in C++ C++ Program For FCFS Containership in C++ Counting Frequencies of Array Elements in C++ Decltype type Specifier in C++ Dynamic _Cast in C++ Difference between int main() and int main(void) in C/C++ Depth First Search Program to Traverse a Graph in C++ Features and Use Of Pointers in C/C++ Fread Function in C++ Programming Fscanf Function in The C++ Functions in C++ With Types and Examples Gmtime Function in C/C++ How is Multiset Implemented in C++ How to Build a Program in C++ How to Declare a 2d Array Dynamically in C++ inheritance Program in C++ int Max and int Min in C/C++ is It Fine to Write Void Main Or Main in C/C++ How to create a button in C++ abs() function in C++ Compile Time Polymorphism in C++ Division in C++ Factorial of a Number in C++ using while Loop Multiset in C++ 4 Pillars of OOPs Approach in C++ Backtracking Time Complexity in C++ C++ Global Variable C++ Pipe Tutorial Observer Design Pattern in C++ Private Inheritance in C++ Pthread in C++ Parameters SDL library in C++ with Examples Pointers in C++ Abstract Factory Design Pattern in C++ Ascending order in C++ How the value is passed in C++ Call by Pointer in C++ Constexpr in C++ Deadlock in C++ Design Patterns in C++ Factory Method for Designing Pattern in C++ How to calculate size of string in C++ Name Mangling and extern in C++ Preventing Object Copy in C++ Program that produces different results in C and C++ Quick Sort in C++ Single Handling in C++ Type difference of Character literals in C VS C++ Use of Inheritance in C++ User-defined literals in C++ Vector methods in C++ Void * in C and C++ Zombie and Orphan Process in C++ Isprint() in C++ List and Vector in C++ List iterators in C++ Merging Two Vectors in C++ Sleep function in C++ Stoi function in C++ String erase() in C++ String Trim in C++ When should we write own Assignment operator in C++ C++ tcp client server example C++ tcp server example Early Binding and Late Binding in C++ Factory Design Pattern in C++ Fisher-Yates shuffle algorithm in C++ For Auto in C++ Group anagrams in C++ How to convert binary string to int in C++ How to convert string to float in C++ How to remove space from string in C++ How to use pair in C++ How to use the string find() in C++ Dynamic Casting in C++ 2D Vector Initialization in C++ C++ GUI Visual Studio C++ IPC C++ Macro Function Example C++ Permutation Overloading Stream Insertion in C++ Overloading array Index operator in C++ Operators that cannot be overloaded in C++ Operator overloading in C++ isprint() function in c++ Is_trivial function in C++ Is assignment operator Inherited in C++ div() function in C++ Default Assignment Operator and References in C++ Copy Constructor vs Assignment Operator in C++ Conversion Operator in C++ Array sum in C++ STL C++ Define Macro C++ Design C++ Factory Pattern TCP Client Server Example in C++ Convert String to Uppercase in C++ exit() and _Exit() in C and C++ Initializer list in C++ Iterator invalidation in C++ Lower bound in C++ Modulus of Two float numbers or double number Pass by value in C++ Set insert function in C++ Std partition_point in C++ Unary Operator Overloading in C++ Using Default Arguments with Virtual Functions Virtual Functions and Runtime Polymorphism What is endl in C++ What is Unary Operator Overloading in C++ Which operators cannot be overloaded in C++ C++ Program to Divide the String Into N equal Parts Gray Code to Binary Code in C++ How to get the value of pi in C++ Multimap value_comp() function in C++ Vector of Vectors in C++ Naïve Bayes Algorithm in C++ Minimum Cost Path Problem in C++ 10 C++ Programming Tricks You Should Know btowc() function in C++ forward_list::cend() in C++ Unordered_multimap max_load_factor() function in C++ Cpp_int in c++ Dynamic Objects in C++ FLOCK() FUNCTION IN C++ Generate Random Double Numbers in C++ How to Assign Infinity to a Number in C++ Jump statements in C++ Multipath inheritance in C++ Out of Range Exception in C++ Size of Class in C++ Size of string in C++ std::binary_negate in c++ Thread_local in C++ Tokenizing a String in C++ Ancestors of a Node in Binary Search Tree C++ program for Double to String Conversion C++ Program to Demonstrate Use of Formatting Flags on Float Output Clamp in C++ K-Dimensional Tree in C++ Mutable Lambda in C++ Power Set in C++ Program to Find Sum of Geometric Progression Std::Back_inserter in C++ Strpbrk() function in C++ Size of int in C++ TYPES OF MANIPULATORS IN C++ Double colon in C++ How to sort vector in C++ How to use Setprecision in C++ How to write a Vector in C++ Insertion in Splay Tree in C++ Merge Sort Algorithm in C++ Printing a Character using ASCII value in C++ Regex in C++ Size of Data Types in C++ Abstract Factory Design Pattern in C++ Sqrtf() function in C++ Static Casting in C++ Using Range in Switch Case in C++ wcstoimax() and wcstoumax() function in C++ What is float in C++ What is the Diamond Problem in C++ Best way to learn C++ ios setstate() function in C++ Nested Namespace in C++ Single Inheritance in C++ std::fixed, std::scientific, std::hexfloat, std::defaultfloat in C++ StringStream in C++ for Decimal to Hexadecimal and back The OFFSETOF() macro in C++ Difference between std::next and std::advance in C++ Hiding of all overloaded methods with same name in base class in C++ C++ program to concatenate two strings using operator overloading Difference between array::fill() and array::swap() in C++ Difference between Friend Function and Virtual Function in C++ Semaphores in C++ Seekg in C++ UDP server- client implementattion in C++ What is long long in C++ CSV file management using C++ Toggle bits of a number except first and last bits in C++ Trailing Return Type C++ 11 Binary search implementation in C++ Different Versions of C++ What is Cascading in C++ Background Colour in C++ BOOL DATATYPE IN C++ BIT VECTORS IN C++

Naïve Bayes Algorithm in C++

Naïve Bayes is a supervised machine learning algorithm for classification tasks such as text classification. The Naïve Bayes algorithm belongs to a family of generative learning algorithms, which model the distribution of inputs for a given class. Naïve Bayes algorithms assume that the features of the input data are independent of the given class, which makes the algorithm make fast and quick predictions accurately.

Naïve Bayes classifiers are simple probabilistic classifiers that make use of Baye's Theorem. This Theorem is based on hypothesis probability, given the data and some prior knowledge. Naïve Bayes makes an assumption that all features are independent of each other in the input data, which is not true in real-world situations. When working on text classification, the Naïve Bayes algorithm is very good because of its good performance and its efficiency.

Naïve Bayes classifiers are the simplest Bayesian network. Still, they have the ability to achieve high accuracy when integrated with kernel density estimation. It is used mainly on text classification that includes a high-dimensional training dataset. It is a probabilistic classifier, which means it predicts on the basis of the probability of an object.

Why is it called Naïve Bayes?

The Naïve Bayes algorithm is made of two words, Naïve and Bayes, which can be defined as follows:

  • Naïve: It is called Naïve because it makes the assumption that the occurrence of a certain feature is independent of the occurrence of the other features. For example, if the fruit is identified on the basis of color, shape, and taste, then red, spherical, and sweet fruit is identified as an apple. Hence, to identify an apple, each feature is contributed individually without on each other.
  • Bayes: It is called Bayes because it is based on the principle of Bayes' Theorem.

Bayes' Theorem:

  • Bayes' Theorem is also called Bayes' Rule or Bayes' Law, which is used to find the probability of a hypothesis with previous knowledge. It is based on the conditional probability.
  • The formula of Bayes' Theorem is defined as:
P(A|B) = P (B|A) P(A)/P(B)

Where,

  1. P (A|B) is Posterior probability: Probability of hypothesis A on the observed event B.
  2. P(B|A) is Likelihood probability: The probability of the evidence given that the probability of a hypothesis is true.
  3. P (A) is Prior Probability: The probability of the hypothesis before observing the evidence.
  4. P (B) is marginal probability, which is the probability of evidence.

Working of Naïve Bayes' Classifier:

Working of Naïve Bayes' Classifier can be explained with the help of the below example:

Consider a dataset of weather conditions and the corresponding target variable "Play". So, using this dataset, we need to classify whether a player should play or not on a particular day given the weather conditions. So, to solve the problem, we need to follow the following step:

  1. Convert the given dataset into frequency tables.
  2. Generate a Likelihood table by finding the probability of given features.
  3. Now, use the Bayes theorem to calculate the posterior probability.

Problem: If the weather is sunny, should the player play?

Solution: To solve this, first consider the below dataset:

OutlookPlay
0RainyYes
1SunnyYes
2OvercastYes
3OvercastYes
4SunnyNo
5RainyYes
6SunnyYes
7OvercastYes
8RainyNo
9SunnyNo
10SunnyYes
11RainyNo
12OvercastYes
13OvercastYes

Frequency table for the Weather Conditions:

WeatherYesNo
Overcast50
Rainy22
Sunny32
Total105

Likelihood table weather condition:

WeatherNoYes
Overcast055/14= 0.35
Rainy224/14=0.29
Sunny235/14=0.35
All4/14=0.2910/14=0.71,

Applying Bayes' Theorem:

P(Yes|Sunny) = P(Sunny|Yes) *P(Yes)/P(Sunny)

P(Sunny|Yes) = 3/10= 0.3

P(Sunny)= 0.35

P(Yes)=0.71

So, P(Yes|Sunny) = 0.3*0.71/0.35= 0.60

P(No|Sunny) = P(Sunny|No) *P(No)/P(Sunny)

P(Sunny|NO) = 2/4=0.5

P(No)= 0.29

P(Sunny)= 0.35

So, P(No|Sunny) = 0.5*0.29/0.35 = 0.41

So, as we can see from the above calculation P(Yes|Sunny) > P(No|Sunny)

Advantages of Naïve Bayes Classifier:

  • Naïve Bayes is one of the fastest and easiest ML algorithms to predict a class of datasets.
  • It can be used for Binary as well as Multi-class Classifications.
  • It performs well in multi-class predictions as compared to the other Algorithms.
  • It is the most popular choice for,text classification problems.

Disadvantages of Naïve Bayes Classifier:

  • Naive Bayes assumes that all features are independent or unrelated, so it cannot learn the relationship between features.

Applications of Naïve Bayes Classifier:

  • It is used for,Credit Scoring.
  • It is used in,medical data classification.
  • It can be used in,real-time predictions because the Naïve Bayes Classifier is an eager learner.
  • It is used in Text classification, such as Spam filtering,and,Sentiment analysis.

Types of Naïve Baiyes Model:

There are three types of Naïve Bayes Models, which are defined as follows:

  1. Gaussian: The Gaussian model makes the assumption that features follow a normal distribution. This means if predictors take continuous values instead of discrete, then the model assumes that these values are sampled from the Gaussian distribution.
  2. Multinomial: The Multinomial Naïve Bayes classifier is used when the data is multinomial distributed. It is primarily used for document classification problems; it means a particular document belongs to which category, such as Sports, Politics, education, etc.
  3. The classifier uses the frequency of words for the predictors.
  4. Bernoulli: The Bernoulli classifier works similarly to the Multinomial classifier, but the predictor variables are the independent Booleans variables, such as if a particular word is present or not in a document. This model is also famous for document classification tasks.

C++ Implementation of Naïve Bayes algorithm:

Code:

Include the required header files, such as iostream and stream, for loading files and string and vector for creating the 2D dynamic array.

#include <iostream>

#include <fstream>

#include <string>

#include <vector>

using namespace std;

Code:

An instance will contain the image and its classification, which takes the image and classification. If there is a face, then 1 and if there is a non-face, then 0.

//an instance will contain the image and its classification(face or non-face)

struct Instance

{

    vector<string> image;

    int classification;         //1 if face, 0 if non-face

};

Explanation:

The vector<string> image represents the image associated with the instance. This is the strings vector, where each string is likely to correspond to a row or line of the image. The second member of the structure is a classification of the integer type, which represents 1 as face and 0 as non-face.

Code:

Define the function fill_othertrainingsets for filling the training set, getData, which takes the input as string data, data label in string format and data.

//function prototypes

void fill_othertrainingsets();

void getData(string data, string datalabel, vector<Instance>& dataset);

void count(vector<vector<int>>& count_h_given_f, vector<vector<int>>& count_b_given_f, vector<Instance>& train);

void findProbability(vector<vector<float>>& prob_h_given_f, char h, int f);

void findProbabiltyGiven(vector<vector<float>>& probability, char h, vector<Instance>& traindata);

void classify();

int classifyInstance(Instance& instance, int instance_number);

void printStats();

void calculateProbabilities();

Code:

//global variables

vector<Instance> trainingset(451);                              //training set consisting of all 451 instances

vector<Instance> trainingset_faces, trainingset_nonfaces;       //training set containing faces and nonfaces respectively

vector<Instance> testingset(150);                               //testing set consisting of all 150 instances

vector<int> testedlabels(150);                                  //vector containing the classification of all test instances

int faces = 217, nonfaces = 234;

//the total probabilities of faces and nonfaces

float prob_face = faces / 451.0, prob_nonface = nonfaces / 451.0;

vector<vector<float>> prob_hash_givenface(70, vector<float>(60));

vector<vector<float>> prob_hash_givennonface(70, vector<float>(60));

vector<vector<float>> prob_blank_givenface(70, vector<float>(60));

vector<vector<float>> prob_blank_givennonface(70, vector<float>(60));

Explanation:

The above code snippet defines the global variable that is used for implementing the Naïve Bayes algorithm,

  • the training set is a vector of features or data points that is used for training that is initialized with a size of 451
  • the trainingset_faces and trainingset_nonfaces are used to separate the vectors for storing the rows labelled as faces and non-faces, respectively.
  • The testing set is a vector of instances for testing that is set to a size of 150.
  • Testlabels is a vector that stores the classification labels for the test rows.
  • Faces and nonfaces are the number or count of face and non-face rows in the train set.
  • Prob_face and prop_nonface are the probabilities of the face or non-face of the rows that are encountered in the training set.
  • Prob_has_givenface, prob_hash_givennonface, prob_blank_givenface and prob_blank_givennonface are the 2-dimensional vectors that represent conditional probabilities.

The code snippet takes a dataset of size 451 rows for training the naïve Bayes algorithm and 150 rows for the testing set; the training set is split into labelled instances as faces and non-faces. The probabilities are calculated for faces and non-face instances that are encountered in the training set.

Code:

The naïve Bayes algorithm is implemented in the main function by calling all the functions defined to implement the naïve Bayes algorithm.

int main()

{

    //fill the training set with all images and their classification, and calculate the number of faces and non-faces

    getData("datatrain/facedatatrainlabels.txt", "datatrain/facedatatrain.txt", training set);

    //fill trainingset_faces and trainingset_nonfaces

    fill_othertrainingsets();

    //fill testing set

    getData("datatest/facedatatestlabels.txt", "datatest/facedatatest.txt", testing set);

    //calculate all probabilities

    calculate probabilities();

    //classify new instances and subsequently store them to tested labels vector and also to classified.txt

    classify();

    //print accuracy and confusion matrix

    printStats();

    return 0;

}

Explanation:

In the main function, the getData function is called to read the data from the text file, which is named facedatatrainlabels.txt and facedatatest.txt for training and testing purposes; the function fill_othertrainingsets split the training data into two vectors, traingset_faces and trainingset_nonfaces that is based on the labels, the probabilities for training sets are calculated that includes global probabilities of faces and non-faces with the help of calculated probabilities Function, with the help classify function the new instances are classified in the testing set with the help of naïve bayes algorithm after that stores the predicted labels in the vector called tested labels and prints the statistics with the help of printStats function.

Code:

The function below calculates the conditional probabilities for a specific attribute given whether a row is a face or non-face.

void calculateProbabilities()

{

    findprobability(prob_hash_givenface, '#', 1);

    findProbability(prob_hash_givennonface, '#', 0);

    findProbability(prob_blank_givenface, ' ', 1);

    findProbability(prob_blank_givennonface, ' ', 0);

}

Explanation:

The above function findProbability evaluates the conditional probabilities based on the presence of specific labels ('#' or ' ') and the class label (1 for face, 0 for non-face). The first line of the function gives the probabilities of the "#" features, given that the instance is a face. The second line gives the probabilities of the "#" feature, given that the instance is a non-face. The third line of the function gives the probabilities of the blank features given that the instance is a face, and the fourth line gives the probabilities of the blank features given that the instance is a non-face.

Code:

The printStats function evaluates and prints the various statistical measures for the naïve Bayes algorithm.

void printStats()

{

    int tp = 0, fn = 0, fp = 0, tn = 0;

    for (int i = 0; i < testingset.size(); i++)

    {

        if (testingset[i].classification == 1)

        {

            if (testedlabels[i] == 1)

            {

                tp++;

            }

            else

            {

                fn++;

            }

        }

        else

        {

            if (testedlabels[i] == 1)

            {

                fp++;

            }

            else

            {

                tn++;

            }

        }

    }

    cout << "Accuracy : " << ((tp + tn) / float(testingset.size())) * 100 << "%\n\n";

    cout << "------------- Confusion Matrix -------------\n\n";

    cout << "Number of True Positives (Actually Face, Predicted Face) : " << tp << "\n";

    cout << "Number of False Negatives (Actually Face, Predicted Non-Face) : " << fn << "\n";

    cout << "Number of False Positives (Actually Non-Face, Predicted Face) : " << fp << "\n";

    cout << "Number of True Negatives (Actually Non-Face, Predicted Non-Face) : " << tn << "\n";

    cout << "\nPrecision : " << (tp / float(tp + fp)) * 100 << "%\n";

    cout << "\nRecall : " << (tp / float(tp + fn)) * 100<< "%\n";

    cout << "\nF - measure : " << ((2*(tp / float(tp + fn))*(tp / float(tp + fp))) / ((tp / float(tp + fn))+(tp / float(tp + fp)))) * 100 << "%\n\n";

}

Explanation:

In the function printStats, four variables are defined named tp, which stands for true positive (rows that are correctly identified as faces), fn which stands for false negative (rows that are wrongly identified as non-faces but face), fp stands for false positive (rows that are wrongly identified as faces but are actually non-faces), and tn stands for true negatives (rows that are correctly identified as non-faces). Then, a confusion matrix is created, which gives the summary of the performance of the naïve Bayes algorithm by showing the counts of true positive, false negative, false positive, and true negative classifications. Then, four statistical measures are calculated, which are Accuracy, Precision, Recall and F measures and the values of each are printed.

Code:

The classify function is used to apply the trained model to the instances of the testing set.

void classify()

{

    ofstream fout("datatest/classified.txt");

    for (int i = 0; i < testingset.size(); i++)

    {

        testedlabels[i] = classifyInstance(testingset[i], i);

        fout << testedlabels[i] << "\n";

    }

    fout.close();

}

Explanation:

The function classifies () opens a file called classified.txt to write the predicted labels, and then it iterates through each instance in the testing set. The classifyInstance() function is used to pass the current instance and the index 'i', which stores the result of the classification.

Code:

The function classifyInstance() is used for classifying instance that represents an image with the help of Naïve Bayes algorithm. The function evaluated probabilities that are based on specific features present ('#' or '') in the image and uses these probabilities to determine whether the instance is classified as face or not.

int classifyInstance(Instance& instance, int instance_number)

{

    long double probability_face = 1.0, probability_nonface = 1.0;

    long double p_face = 1.0, p_nonface = 1.0;

    float m;

    if (instance_number == 61)

    {

        m = 1.2;

    }

    else

    {

        m = 1.5;

    }

    for (int i = 0; i < 70; i++)

    {

        for (int j = 0; j < 60; j++)

        {

            if (instance.image[i][j] == '#')

            {

                p_face = p_face * prob_hash_givenface[i][j] * m;

                p_nonface = p_nonface * prob_hash_givennonface[i][j] * m;

            }

            else

            {

                p_face = p_face * prob_blank_givenface[i][j] * m;

                p_nonface = p_nonface * prob_blank_givennonface[i][j] * m;

            }

        }

    }

    probability_face = prob_face * p_face;

    probability_nonface = prob_nonface * p_nonface;

    if (probability_face > probability_nonface)

    {

        return 1;

    }

    else

    {

        return 0;

    }

}

Explanation:

The code initializes a probability of face and the probability of non-face, and it initializes another variable and then adjusts the value of m that is based on the number. The adjustment implementation is specific and may be determined with the help of experimentation or fine-tuning. The function then iterates through the pixels of an image (70 rows and 60 columns). The probabilities are then updated for each pixel, the probabilities based on the presence of specified features ('#' or '') and the conditional probabilities like 'prob_hash_givenface, the probability of a non-blank face and the probability of the given blank face that is given.

Code:

The function fill_othertrainingsets() is used to iterate over the training vector, which contains attributes with image data and their corresponding classification (1 for face, 0 for non-face). It splits these attributes into two different vectors.

void fill_othertrainingsets()

{

    for (int i = 0; i < trainingset.size(); i++)

    {

        if (trainingset[i].classification == 1)

        {

            trainingset_faces.push_back(trainingset[i]);

        }

        else

        {

            trainingset_nonfaces.push_back(trainingset[i]);

        }

    }

}

Explanation:

The iteration is done with the help of a for loop to iterate over each attribute in the training vector, and for every row, the classification member value is checked. If the current row is classified as a face, the classification = 1 and it is added to the training set faces vector, and If the current row is non-face, the classification == 0 and it is added to the training set non-faces vector.

Code:

The function count is responsible for counting the occurrences of specific attributes ('#' and '') in the images of the instances with the training data.

void count(vector<vector<int>>& count_h_given_f, vector<vector<int>>& count_b_given_f, vector<Instance>& traindata)

{

    for (int i = 0; i < traindata.size(); i++)

    {

        for (int j = 0; j < 70; j++)

        {

            for (int k = 0; k < 60; k++)

            {

                if (traindata[i].image[j][k] == '#')

                {

                    count_h_given_f[j][k]++;

                }

                else

                {

                    count_b_given_f[j][k]++;

                }

            }

        }

    }

}

Explanation:

The function takes the three input count_h_given_f, a 2-dimensional vector for storing the counts of the '#' feature given that the instance is facing, count_b_given_f is a 2-dimensional vector that stores the count of the blank space in the image ('') or blank space feature that instance is a face and a traindata that is a vector of instances that represents the training data. A nested loop is run with three loops that iterate through each instance in the training data ('i'), each row of the image ('j'), and each column of the image ('k'). The value of pixels is checked in the innermost loop, the value of pixel in the current position of the image for the current row that is traindata[i].image[j][k]. If the value of the pixel is '#', the count is incremented in the vector 'count_h_given_f', and if the value of the pixel is '' that is blank space, then the count is incremented in the vector count_b_given_f. The main aim of this function is to count the occurrences of specific attributes in the image of the training instances, separately for '#' and ''.

Code:

The function find probability is designed to evaluate the probabilities of encountering specific features at each position in the image.

void findProbabiltyGiven(vector<vector<float>>& probability, char h, vector<Instance>& traindata)

{

    float n = traindata.size();

    float pseudo = 1.9;                 //pseudocount taken to be 1.9

    vector<vector<int>> count_hash_given(70, vector<int>(60));

    vector<vector<int>> count_blank_given(70, vector<int>(60));

    count(count_hash_given, count_blank_given, traindata);

    if (h == '#')

    {

        for (int i = 0; i < 70; i++)

        {

            for (int j = 0; j < 60; j++)

            {

                probability[i][j] = ((count_hash_given[i][j] + (0.5*pseudo)) / (n + pseudo));       //prior probability is 0.5

            }

        }

    }

    else

    {

        for (int i = 0; i < 70; i++)

        {

            for (int j = 0; j < 60; j++)

            {

                probability[i][j] = ((count_blank_given[i][j] + (0.5*pseudo)) / (n + pseudo));      //prior probability is 0.5

            }

        }

    }

}

Explanation:

The function takes three inputs: the probability, which is a 2-dimensional vector that stores the evaluated probabilities for every position in the image, h which is the specific feature for which probabilities are calculated ('#', ''); and a train data, which is a vector of rows that represents the training data. Laplace smoothing is applied for calculating the probability with the help of a pseudocount that helps to avoid zero probabilities and addresses the issue of unseen features. The function takes the help of the count function to calculate the counts of occurrences of '#' and '' for every position in the image, given the class label. On the basis of a specific feature ('#' or ''), the function evaluates the probabilities for each position in the image. The probability is evaluated with the help of the Laplace-smoothed formula that is given by (count + (0.5 * pseudo)) / (n + pseudo), where the count is the number of occurrences for the feature, pseudo is the pseudo count and n total number of instances. The probabilities that are evaluated are stored in the probability vector.

Code:

The function findProbability evaluates the probabilities to the findProbabilityGiven function; the function takes the input as a 2-dimensional vector named probability and a character h that represents a specific feature ('#' or ''), and an integer f that indicates whether to evaluate the probabilities for faces (1) or non-faces(0).

void findProbability(vector<vector<float>>& probability, char h, int f)

{

    if (f == 1)

    {

        findProbabiltyGiven(probability, h, trainingset_faces);

    }

    else

    {

        findProbabiltyGiven(probability, h, trainingset_nonfaces);

    }

}

Explanation:

This function aims to decide whether to evaluate the probabilities for faces or non-faces and then give the task to the function findProbabilityGiven.

Code:

The function getData is built to read the data from the two files. One file contains the labels, and the other file contains the image data.

void getData(string datalabeltxt, string datatxt, vector<Instance>& dataset)

{

    ifstream trainingfile(datalabeltxt);

    string line;

    vector<int> labels;             //this array contains the classifications of the training/testing set

    for (int i = 0; getline(training file, line); i++)

    {

        labels.push_back(stoi(line));

    }

    trainingfile.close();

    trainingfile.open(datatxt);

    for (int i = 0; i < dataset.size();i++)

    {

        dataset[i].classification = labels[i];

    }

    int i = 0, z = 1;

    while (getline(trainingfile, line))

    {

        dataset[i].image.push_back(line);

        z++;

        if ((z - 1) % 70 == 0)

        {

            i++;

        }

    }

    trainingfile.close();

}

Explanation:

The function gives access to open and read the file, which contains the labels of every instance in the dataset. Each line is read, and then each line is converted into a label from a string to an integer with the help of a stop.

When you run the program, the output will be like as given below, which tells the accuracy of the naïve Bayes algorithm and a confusion matrix corresponding to the naïve Bayes algorithm, which gives the true positive value, true negative value, false positive value, false negative value and the three statistical measure such as precision, recall and f-measure.

Output:

Accuracy: 89.3333%

Confusion Matrix

                                         Predicted Face        Predicted Non-Face

Actual Face               68                              5

Actual Non-Face           11                              66

Precision: 86.076%

Recall: 93.1507%

F-measure: 89.4737%

Conclusion:

The naïve Bayes algorithm is a type of supervised machine learning algorithm that works on the basis of Baye's Theorem. The naïve Bayes algorithm makes the assumption that there is independence among features, and that simplifies complex problems. The Naïve Bayes algorithm is commonly used for classification tasks, especially when working with textual data; it evaluates the probabilities of an instance that belongs to a particular class by multiplying the probabilities of the individual attribute of that given class. The naïve Bayes algorithm is effective and particularly used for text classification and spam filtering. This algorithm is efficient in computation and requires minimal training data, making it suitable for various applications.