I.K. GUJRAL PUNJAB TECHNICAL UNIVERSITY, JALANDHAR GJIMT || 2022 A Laboratory File On Artificial Intelligence & Soft Computing Submitted For Master of Computer Applications In GJIMT Lab At Gian Jyoti Institute of Management and Technology 2022 Subject Code:- PGCA1929 Submitted To:- Submitted By:- Ms. Harmeet Kaur (Astt. Peofessor) Manjit Sir (Lab Incharge) GJIMT Mohali Ajit Kumar MCA 3rd Semester Roll No.:-2111914 GJIMT || 2022 -: INDEX :Sr. No 1. 2. 3. Experiment Page No. Use logic programming in Python to check for prime numbers. Use logic programming in Python parse a family tree and infer the relationships between the family members. 3 4, 5, 6, 7, 8 4. Python script for building a puzzle solver. Implementation of uninformed search techniques in Python. 5. Implementation of heuristic search techniques in Python. 6. Python script for tokenizing text data. 17, 18 7. 19, 20 8. Extracting the frequency of terms using a Bag of Words model. Predict the category to which a given piece of text belongs. 9. Python code for visualizing audio speech signal. 10. Python code for Generating audio signals. 26, 27, 28, 29 Create a perception with appropriate no. of inputs and outputs. Train it using fixed increment learning algorithm 30. 31, 32 until no change in weights is required. Output the final weights. Implement AND function using ADALINE with bipolar 33, 34, 35 inputs and outputs. Implement AND function using MADALINE with bipolar 36, 37, 38 inputs and outputs. Construct and test auto associative network for input 39 vector using HEBB rule. Construct and test auto associative network for input 40 vector using outer product rule. Construct and test heteroassociative network for binary 41, 42, 43 inputs and targets. 11. 12. 13. 14. 15. 16. 17. Create a back propagation network for a given input pattern. Perform 3 epochs of operation. 18. Implement Union, Intersection, Complement and Difference operations on fuzzy sets. Also create fuzzy relation by Cartesian product of any two fuzzy sets and perform maxmin composition on any two fuzzy relations. Maximize the function f(x)=x2 using GA, where x ranges form 0-25. Perform 6 iterations. 19. Remarks 9, 10 11, 12 13, 14, 15, 16 21, 22, 23 24, 25 44, 45, 46 47, 48, 49, 50, 51, 52 53, 54 Page | 2 GJIMT || 2022 Experiment:- 01 Aim:- Use logic programming in Python to check for prime numbers. Prime Numbers:- Prime numbers are natural numbers that are divisible by only 1 and the number itself. Example:- 2, 3, 5, 7, 11, 13, etc. Code:# Input from the user num = int(input("Enter a number: ")) # If number is greater than 1 if num > 1: # Check if factor exist for i in range(2,num): if (num % i) == 0: print(num,"is not a prime number") break else: print(num,"is a prime number") else: print(num,"is not a prime number") Output:- Page | 3 GJIMT || 2022 Experiment:- 02 Aim:- Use logic programming in Python parse a family tree and infer the relationships between the family members. Family Tree: The core of the Family Tree data model are the individual persons that, linked together by relationships, create the Tree. The purpose of the other data objects is to give support and detailed information about the person, relationships and the research recorded in the Family Tree. Parsing a family tree: Now that we are more familiar with logic programming, let's use it to solve an interesting problem. Consider the following family tree:- John and Megan have three sons - William, David, and Adam. The wives of William, David, and Adam are Emma, Olivia, and Lily respectively. William and Emma have two children - Chris and Stephanie. David and Olivia have five children - Wayne, Tiffany, Julie, Neil, and Peter. Adam and Lily have one child Sophia. Based on these facts, we can create a program that can tell us the name of Wayne's grandfather or Sophia's uncles are. Even though we have not explicitly specified anything about the grandparent or uncle relationships, logic programming can infer them. Page | 4 GJIMT || 2022 These relationships are specified in a file called relationships.json provided for you. The file looks like the following: Code:- relationships.json { "father": [ { "John": "William" }, { "John": "David" }, { "John": "Adam" }, { "William": "Chris" }, { "William": "Stephanie" }, { "David": "Wayne" }, { "David": "Tiffany" }, { "David": "Julie" }, { "David": "Neil" }, { "David": "Peter" }, { "Adam": "Sophia" } ], "mother": [ { "Megan": "William" }, { "Megan": "David" }, { "Megan": "Adam" }, { "Emma": "Stephanie" }, { "Emma": "Chris" }, { "Olivia": "Tiffany" }, { "Olivia": "Julie" }, { "Olivia": "Neil" }, { "Olivia": "Peter" }, { "Lily": "Sophia" } ] } Code:- family.py import json from kanren import Relation, facts, run, conde, var, eq # Check if 'x' is the parent of 'y' def parent(x, y): return conde([father(x, y)], [mother(x, y)]) # Check if 'x' is the grandparent of 'y' def grandparent(x, y): temp = var() return conde((parent(x, temp), parent(temp, y))) # Check for sibling relationship between 'a' and 'b' Page | 5 GJIMT || 2022 def sibling(x, y): temp = var() return conde((parent(temp, x), parent(temp, y))) # Check if x is y's uncle def uncle(x, y): temp = var() return conde((father(temp, x), grandparent(temp, y))) if __name__=='__main__': father = Relation() mother = Relation() with open (r'C:\\Users\ajitk\Desktop\PythonAI\.vscode\relationships.json') as f: d = json.loads(f.read()) for item in d['father']: facts(father, (list(item.keys())[0], list(item.values())[0])) for item in d['mother']: facts(mother, (list(item.keys())[0], list(item.values())[0])) x = var() # John's children name = 'John' output = run(0, x, father(name, x)) print("\nList of " + name + "'s children:") for item in output: print(item) # William's mother name = 'William' output = run(0, x, mother(x, name))[0] print("\n" + name + "'s mother:\n" + output) # Adam's parents name = 'Adam' output = run(0, x, parent(x, name)) print("\nList of " + name + "'s parents:") for item in output: print(item) # Wayne's grandparents name = 'Wayne' output = run(0, x, grandparent(x, name)) Page | 6 GJIMT || 2022 print("\nList of " + name + "'s grandparents:") for item in output: print(item) # Megan's grandchildren name = 'Megan' output = run(0, x, grandparent(name, x)) print("\nList of " + name + "'s grandchildren:") for item in output: print(item) # David's siblings name = 'David' output = run(0, x, sibling(x, name)) siblings = [x for x in output if x != name] print("\nList of " + name + "'s siblings:") for item in siblings: print(item) # Tiffany's uncles name = 'Tiffany' name_father = run(0, x, father(x, name))[0] output = run(0, x, uncle(x, name)) output = [x for x in output if x != name_father] print("\nList of " + name + "'s uncles:") for item in output: print(item) # All spouses a, b, c = var(), var(), var() output = run(0, (a, b), (father, a, c), (mother, b, c)) print("\nList of all spouses:") for item in output print('Husband:', item[0], '<==> Wife:', item[1]) Page | 7 GJIMT || 2022 Output:- Page | 8 GJIMT || 2022 Experiment:- 03 Aim:- Python script for building a puzzle solver. Code:from kanren import * from kanren.core import lall # Declare the variable people = var() # Define the rules rules = lall( # There are 4 people (eq, (var(), var(), var(), var()), people), # Steve's car is blue (membero, ('Steve', var(), 'blue', var()), people), # Person who owns the cat lives in Canada (membero, (var(), 'cat', var(), 'Canada'), people), # Matthew lives in USA (membero, ('Matthew', var(), var(), 'USA'), people), # The person who has a black car lives in Australia (membero, (var(), var(), 'black', 'Australia'), people), # Jack has a cat (membero, ('Jack', 'cat', var(), var()), people), # Alfred lives in Australia (membero, ('Alfred', var(), var(), 'Australia'), people), # Person who owns the dog lives in France (membero, (var(), 'dog', var(), 'France'), people), # Who is the owner of the rabbit? (membero, (var(), 'rabbit', var(), var()), people) ) # Run the solver solutions = run(0, people, rules) # Extract the output output = [house for house in solutions[0] if 'rabbit' in house][0][0] # Print the output print('\n' + output + ' is the owner of the rabbit') print('\nHere are all the details:') Page | 9 GJIMT || 2022 attribs = ['Name', 'Pet', 'Color', 'Country'] print('\n' + '\t\t'.join(attribs)) print('=' * 57) for item in solutions[0]: print('') print('\t\t'.join([str(x) for x in item])) Output:- Page | 10 GJIMT || 2022 Experiment:- 04 Aim:- Implementation of uninformed search techniques in Python. Uninformed Search:- Uninformed search is a class of general-purpose search algorithms which operates in brute force-way. Uninformed search algorithms do not have additional information about state or search space other than how to traverse the tree, so it is also called blind search. Following are the various types of uninformed search algorithms: Breadth-first Search Depth-first Search Depth-limited Search Iterative deepening depth-first search Uniform cost search Bidirectional Search Breadth-first Search:- Breadth-First Search (BFS) is an algorithm used for traversing graphs or trees. Traversing means visiting each node of the graph. Breadth-First Search is a recursive algorithm to search all the vertices of a graph or a tree. BFS in python can be implemented by using data structures like a dictionary and lists. Breadth-First Search in tree and graph is almost the same. The only difference is that the graph may contain cycles, so we may traverse to the same node again. BFS Pseudo Code:- The pseudo code for BFS in python goes as below:create a queue Q mark v as visited and put v into Q while Q is non- empty remove the head u of Q mark and enqueue all(unvisited) neighbors of u BFS implementation in Python: Now, we will see how the source code of the program for implementing breadth first search in python. Consider the following graph which is implemented in the code below:- Page | 11 GJIMT || 2022 Code:graph = { '5' : ['3','7'], '3' : ['2', '4'], '7' : ['8'], '2' : [], '4' : ['8'], '8' : [] } visited = [] # List for visited nodes. queue = [] #Initialize a queue def bfs(visited, graph, node): #function for BFS visited.append(node) queue.append(node) while queue: # Creating loop to visit each node m = queue.pop(0) print (m, end = " ") for neighbour in graph[m]: if neighbour not in visited: visited.append(neighbour) queue.append(neighbour) # Driver Code print("Following is the Breadth-First Search") bfs(visited, graph, '5') # function calling Output:- Page | 12 GJIMT || 2022 Experiment:- 05 Aim:- Implementation of heuristic search techniques in Python. Heuristic Search:- A heuristic technique is a problem specific approach that employs a practical method that often provides sufficient accuracy for the immediate goals. Following are the various types of uninformed search algorithms: A* search Simulated Annealing Hill Climbing Optimal search Greedy best-first search Memory bounded heuristic search A* Search Algorithm: A* search is the most commonly known form of best-first search. It uses the heuristic function h(n) and cost to reach the node n from the start state g(n). It has combined features of UCS and greedy best-first search, by which it solve the problem efficiently. It finds the shortest path through the search space using the heuristic function. This search algorithm expands fewer search tree and gives optimal results faster. A* Search implementation in Python: we are going to find out how the A* search algorithm can be used to find the most cost-effective path in a graph. Consider the following graph below. Page | 13 GJIMT || 2022 Code:def aStarAlgo(start_node, stop_node): open_set = set(start_node) closed_set = set() g = {} #store distance from starting node parents = {}# parents contains an adjacency map of all nodes #ditance of starting node from itself is zero g[start_node] = 0 #start_node is root node i.e it has no parent nodes #so start_node is set to its own parent node parents[start_node] = start_node while len(open_set) > 0: n = None #node with lowest f() is found for v in open_set: if n == None or g[v] + heuristic(v) < g[n] + heuristic(n): n=v if n == stop_node or Graph_nodes[n] == None: pass else: for (m, weight) in get_neighbors(n): #nodes 'm' not in first and last set are added to first #n is set its parent if m not in open_set and m not in closed_set: open_set.add(m) parents[m] = n g[m] = g[n] + weight #for each node m,compare its distance from start i.e g(m) to the #from start through n node else: if g[m] > g[n] + weight: #update g(m) g[m] = g[n] + weight #change parent of m to n parents[m] = n Page | 14 GJIMT || 2022 #if m in closed set,remove and add to open if m in closed_set: closed_set.remove(m) open_set.add(m) if n == None: print('Path does not exist!') return None # if the current node is the stop_node # then we begin reconstructin the path from it to the start_node if n == stop_node: path = [ ] while parents[n] != n: path.append(n) n = parents[n] path.append(start_node) path.reverse() print('Path found: {}'.format(path)) return path # remove n from the open_list, and add it to closed_list # because all of his neighbors were inspected open_set.remove(n) closed_set.add(n) print('Path does not exist!') return None #define fuction to return neighbor and its distance #from the passed node def get_neighbors(v): if v in Graph_nodes: return Graph_nodes[v] else: return None #for simplicity we ll consider heuristic distances given #and this function returns heuristic distance for all nodes def heuristic(n): H_dist = { 'A': 11, Page | 15 GJIMT || 2022 'B': 6, 'C': 99, 'D': 1, 'E': 7, 'G': 0, } return H_dist[n] #Describe your graph here Graph_nodes = { 'A': [('B', 2), ('E', 3)], 'B': [('C', 1),('G', 9)], 'C': None, 'E': [('D', 6)], 'D': [('G', 1)], } aStarAlgo('A', 'G') Output:- Page | 16 GJIMT || 2022 Experiment:- 06 Aim:- Python script for tokenizing text data. Tokenizing:- Tokenization is a common task a data scientist comes across when working with text data. It consists of splitting an entire text into small units, also known as tokens. Most Natural Language Processing (NLP) projects have tokenization as the first step because it’s the foundation for developing good models and helps better understand the text we have. Following are some ways for Tokenizing text data: Simple tokenization with .split: Code:my_text = """Hey I'm Ajit Kumar . I Just Love Coding .""" print(my_text.split('. ')) print(my_text.split()) Output:- Tokenization with NLTK: Code:# import the existing word and sentence tokenizing # libraries import nltk nltk.download('punkt') from nltk.tokenize import sent_tokenize, word_tokenize text = "Natural language processing (NLP) is a field " + \ "of computer science, artificial intelligence " + \ "and computational linguistics concerned with " + \ "the interactions between computers and human " + \ "(natural) languages, and, in particular, " + \ "concerned with programming computers to " + \ "fruitfully process large natural language " + \ Page | 17 GJIMT || 2022 "corpora. Challenges in natural language " + \ "processing frequently involve natural " + \ "language understanding, natural language" + \ "generation frequently from formal, machine" + \ "-readable logical forms), connecting language " + \ "and machine perception, managing human-" + \ "computer dialog systems, or some combination " + \ "thereof." #print(sent_tokenize(text)) print(word_tokenize(text)) Output:- Page | 18 GJIMT || 2022 Experiment:- 07 Aim:- Extracting the frequency of terms using a Bag of Words model. Bag of Words model:- Bag of Words model is used to preprocess the text by converting it into a bag of words, which keeps a count of the total occurrences of most frequently used words. This model can be visualized using a table, which contains the count of words corresponding to the word itself. Code:def vectorize(tokens): vector=[] for w in filtered_vocab: vector.append(tokens.count(w)) return vector def unique(sequence): seen = set() return [x for x in sequence if not (x in seen or seen.add(x))] #create a list of stopwords.You can import stopwords from nltk too stopwords=["to","is","a"] #list of special characters.You can use regular expressions too special_char=[",",":"," ",";",".","?"] #Write the sentences in the corpus,in our case, just two string1="Welcome to Great Learning , Now start learning" string2="Learning is a good practice" #convert them to lower case string1=string1.lower() string2=string2.lower() #split the sentences into tokens tokens1=string1.split() tokens2=string2.split() print(tokens1) Page | 19 GJIMT || 2022 print(tokens2) #create a vocabulary list vocab=unique(tokens1+tokens2) print(vocab) #filter the vocabulary list filtered_vocab=[] for w in vocab: if w not in stopwords and w not in special_char: filtered_vocab.append(w) print(filtered_vocab) #convert sentences into vectords vector1=vectorize(tokens1) print(vector1) vector2=vectorize(tokens2) print(vector2) Output:- Page | 20 GJIMT || 2022 Experiment:- 08 Aim:- Predict the category to which a given piece of text belongs. Code:#import sentimentintensityAnalyzer class #from VaderSentiment.VaderSentiment import SentimentIntensityAnalyzer from nltk.sentiment.vader import SentimentIntensityAnalyzer import nltk from PIL import Image #nltk.download() from tkinter import* root=Tk() root.title("Senti ment Analysis") root.configure(background='#FFE4C4') label1=Label(root,text="SENTIMENT ANALYSIS!",background='#FFE4C4',fg="#D2691E",font="Arial 50 bold").place(x=380,y=30) label1=Label(root,text="Text:",background='#FFE4C4',fg='#D2691E',font="Ari al 35 bold").place(x=550,y=240) large_font=('verdana',30) entry1Var=StringVar(value='large_font') ent1=Entry(root,font='large_font') ent1.place(x=750,y=250) analyzer= SentimentIntensityAnalyzer() #function is prime sentiment Page | 21 GJIMT || 2022 def sentime nt_scor es(): sentenc e= ent1.ge t() sid_obj=SentimentIntensityAnalyzer() sentiment_dict=sid_obj.polarity_scores( sentence) print("Overall Sentiment Dictionary is:",sentiment_dict) print("Sentence was rated as:",sentiment_dict['neg']*100,"% Negative") print("Sentence was rated as:",sentiment_dict['neu']*100,"% Neutral") print("Sentence was rated as:",sentiment_dict['pos']*100,"% Positive") print("Sentence was overall rated as:",end=' ') if sentiment_dict['compound']>=0.05: print("Positive") result="Positive" elif sentiment_dict['compound']<=-0.05: print("Negative") result="Negative" else: print("Neutral") result="Neutral" messagebox.showinfo(title='Result',message=" Sentence was overall rated as:%s"%(result)) button1=Button(root,text="predict",command= Page | 22 GJIMT || 2022 sentiment_scores,width=10,background='#A05 2 2D',font="Arial 15",fg="#D2691E") button1.place(x=600,y=400) button2=Button(root,text="Quit",command=ro ot.destroy,width=10,background='#A0522D',fo n t="Arial 15",fg="#D2691E") button2.place(x=800,y=400) root.mainloop() Output:- Page | 23 GJIMT || 2022 Experiment:- 09 Aim:- Python code for visualizing audio speech signal. Code:def showing_audiotrack(): # We use a variable previousTime to store the time when a plot update is made # and to then compute the time taken to update the plot of the audio data. previousTime = time.time() # Turning the interactive mode on plt.ion() # Each time we go through a number of samples in the audio data that corresponds to one second of audio, # we increase spentTime by one (1 second). spentTime = 0 # Let's the define the update periodicity updatePeriodicity = 2 # expressed in seconds # Plotting the audio data and updating the plot for i in range(n): # Each time we read one second of audio data, we increase spentTime : if i // Fs != (i-1) // Fs: spentTime += 1 # We update the plot every updatePeriodicity seconds if spentTime == updatePeriodicity: # Clear the previous plot plt.clf() # Plot the audio data plt.plot(time_axis, sound_axis) # Plot a red line to keep track of the progression plt.axvline(x=i / Fs, color='r') plt.xlabel("Time (s)") plt.ylabel("Audio") plt.show() # shows the plot plt.pause(updatePeriodicity-(time.time()-previousTime)) # a forced pause to synchronize the audio being played with the audio track being displayed previousTime = time.time() spentTime = 0 GJIMT || 2022 Output:- GJIMT || 2022 Experiment:- 10 Aim:- Python code for Generating audio signals. Code:#!/usr/bin/env python import sys import wave import math import struct import random import argparse from itertools import * def grouper(n, iterable, fillvalue=None): "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" args = [iter(iterable)] * n return izip_longest(fillvalue=fillvalue, *args) def sine_wave(frequency=440.0, framerate=44100, amplitude=0.5): ''' Generate a sine wave at a given frequency of infinite length. ''' period = int(framerate / frequency) if amplitude > 1.0: amplitude = 1.0 if amplitude < 0.0: amplitude = 0.0 lookup_table = [float(amplitude) * math.sin(2.0*math.pi*float(frequency)*(float(i%period)/float(framerate) )) for i in xrange(period)] return (lookup_table[i%period] for i in count(0)) def square_wave(frequency=440.0, framerate=44100, amplitude=0.5): for s in sine_wave(frequency, framerate, amplitude): if s > 0: yield amplitude elif s < 0: yield -amplitude else: yield 0.0 def damped_wave(frequency=440.0, framerate=44100, amplitude=0.5, length=44100): if amplitude > 1.0: amplitude = 1.0 if amplitude < 0.0: amplitude = 0.0 GJIMT || 2022 return (math.exp(-(float(i%length)/float(framerate))) * s for i, s in enumerate(sine_wave(frequency, framerate, amplitude))) def white_noise(amplitude=0.5): ''' Generate random samples. ''' return (float(amplitude) * random.uniform(-1, 1) for i in count(0)) def compute_samples(channels, nsamples=None): ''' create a generator which computes the samples. essentially it creates a sequence of the sum of each function in the channel at each sample in the file for each channel. ''' return islice(izip(*(imap(sum, izip(*channel)) for channel in channels)), nsamples) def write_wavefile(filename, samples, nframes=None, nchannels=2, sampwidth=2, framerate=44100, bufsize=2048): "Write samples to a wavefile." if nframes is None: nframes = -1 w = wave.open(filename, 'w') w.setparams((nchannels, sampwidth, framerate, nframes, 'NONE', 'not compressed')) max_amplitude = float(int((2 ** (sampwidth * 8)) / 2) - 1) # split the samples into chunks (to reduce memory consumption and improve performance) for chunk in grouper(bufsize, samples): frames = ''.join(''.join(struct.pack('h', int(max_amplitude * sample)) for sample in channels) for channels in chunk if channels is not None) w.writeframesraw(frames) w.close() return filename def write_pcm(f, bufsize=2048): samples, sampwidth=2, framerate=44100, GJIMT || 2022 "Write samples as raw PCM data." max_amplitude = float(int((2 ** (sampwidth * 8)) / 2) - 1) # split the samples into chunks (to reduce memory consumption and improve performance) for chunk in grouper(bufsize, samples): frames = ''.join(''.join(struct.pack('h', int(max_amplitude * sample)) for sample in channels) for channels in chunk if channels is not None) f.write(frames) f.close() return filename def main(): parser = argparse.ArgumentParser() parser.add_argument('-c', '--channels', help="Number of channels to produce", default=2, type=int) parser.add_argument('-b', '--bits', help="Number of bits in each sample", choices=(16,), default=16, type=int) parser.add_argument('-r', '--rate', help="Sample rate in Hz", default=44100, type=int) parser.add_argument('-t', '--time', help="Duration of the wave in seconds.", default=60, type=int) parser.add_argument('-a', '--amplitude', help="Amplitude of the wave on a scale of 0.0-1.0.", default=0.5, type=float) parser.add_argument('-f', '--frequency', help="Frequency of the wave in Hz", default=440.0, type=float) parser.add_argument('filename', help="The file to generate.") args = parser.parse_args() # each channel is defined by infinite functions which are added to produce a sample. channels = ((sine_wave(args.frequency, args.rate, args.amplitude),) for i in range(args.channels)) # convert the channel functions into waveforms samples = compute_samples(channels, args.rate * args.time) # write the samples to a file if args.filename == '-': filename = sys.stdout else: filename = args.filename GJIMT || 2022 write_wavefile(filename, samples, args.channels, args.bits / 8, args.rate) if __name__ == "__main__": main() Output:- Experiment:- 11 args.rate * args.time, GJIMT || 2022 Aim:- Create a perception with appropriate no. of inputs and outputs. Train it using fixed increment learning algorithm until no change in weights is required. Output the final weights. Code:class Perceptron: #constructor def __init__ (self): self.w = None self.b = None #model def model(self, x): return 1 if (np.dot(self.w, x) >= self.b) else 0 #predictor to predict on the data based on w def predict(self, X): Y = [] for x in X: result = self.model(x) Y.append(result) return np.array(Y) def fit(self, X, Y, epochs = 1, lr = 1): self.w = np.ones(X.shape[1]) self.b = 0 accuracy = {} max_accuracy = 0 wt_matrix = [] #for all epochs for i in range(epochs): for x, y in zip(X, Y): y_pred = self.model(x) if y == 1 and y_pred == 0: self.w = self.w + lr * x self.b = self.b - lr * 1 GJIMT || 2022 elif y == 0 and y_pred == 1: self.w = self.w - lr * x self.b = self.b + lr * 1 wt_matrix.append(self.w) accuracy[i] = accuracy_score(self.predict(X), Y) if (accuracy[i] > max_accuracy): max_accuracy = accuracy[i] chkptw = self.w chkptb = self.b #checkpoint (Save the weights and b value) self.w = chkptw self.b = chkptb print(max_accuracy) #plot the accuracy values over epochs plt.plot(accuracy.values()) plt.xlabel("Epoch #") plt.ylabel("Accuracy") plt.ylim([0, 1]) plt.show() #return the weight matrix, that contains weights over all epochs return np.array(wt_matrix) Output:- GJIMT || 2022 Experiment:- 12 GJIMT || 2022 Aim:- Implement AND function using ADALINE with bipolar inputs and outputs. Code:# import the module numpy import numpy as np # the features for the or model , here we have # taken the possible values for combination of # two inputs features = np.array( [ [-1, -1], [-1, 1], [1, -1], [1, 1] ]) # labels for the or model, here the output for # the features is taken as an array labels = np.array([-1, 1, 1, 1]) # to print the features and the labels for # which the model has to be trained print(features, labels) # initialise weights, bias , learning rate, epoch weight = [0.5, 0.5] bias = 0.1 learning_rate = 0.2 epoch = 10 for i in range(epoch): # epoch is the number of the model is trained # with the same data print("epoch :", i+1) # variable to check if there is no change in previous # weight and present calculated weight # initial error is kept as 0 sum_squared_error = 0.0 # for each of the possible input given in the features for j in range(features.shape[0]): GJIMT || 2022 # actual output to be obtained actual = labels[j] # the value of two features as given in the features # array x1 = features[j][0] x2 = features[j][1] # net unit value computation performed to obtain the # sum of features multiplied with their weights unit = (x1 * weight[0]) + (x2 * weight[1]) + bias # error is computed so as to update the weights error = actual - unit # print statement to print the actual value , predicted # value and the error print("error =", error) # summation of squared error is calculated sum_squared_error += error * error # updation of weights, summing up of product of learning rate , # sum of squared error and feature value weight[0] += learning_rate * error * x1 weight[1] += learning_rate * error * x2 # updation of bias, summing up of product of learning rate and # sum of squared error bias += learning_rate * error print("sum of squared error = ", sum_squared_error/4, "\n\n") Output:- GJIMT || 2022 Experiment:- 13 GJIMT || 2022 Aim:- Implement AND function using MADALINE with bipolar inputs and outputs. Code:# import the module numpy import numpy as np # the features for the or model , here we have # taken the possible values for combination of # two inputs features = np.array( [ [-1, -1], [-1, 1], [1, -1], [1, 1] ]) # labels for the or model, here the output for # the features is taken as an array labels = np.array([-1, 1, 1, 1]) # to print the features and the labels for # which the model has to be trained print(features, labels) # initialise weights, bias , learning rate, epoch weight = [0.5, 0.5] bias = 0.1 learning_rate = 0.2 epoch = 10 for i in range(epoch): # epoch is the number of the model is trained # with the same data print("epoch :", i+1) # variable to check if there is no change in previous # weight and present calculated weight # initial error is kept as 0 sum_squared_error = 0.0 # for each of the possible input given in the features for j in range(features.shape[0]): GJIMT || 2022 # actual output to be obtained actual = labels[j] # the value of two features as given in the features # array x1 = features[j][0] x2 = features[j][1] # net unit value computation performed to obtain the # sum of features multiplied with their weights unit = (x1 * weight[0]) + (x2 * weight[1]) + bias # error is computed so as to update the weights error = actual - unit # print statement to print the actual value , predicted # value and the error print("error =", error) # summation of squared error is calculated sum_squared_error += error * error # updation of weights, summing up of product of learning rate , # sum of squared error and feature value weight[0] += learning_rate * error * x1 weight[1] += learning_rate * error * x2 # updation of bias, summing up of product of learning rate and # sum of squared error bias += learning_rate * error print("sum of squared error = ", sum_squared_error/4, "\n\n") Output:- GJIMT || 2022 GJIMT || 2022 Experiment:- 14 Aim:- Construct and test auto associative network for input vector using HEBB rule. Code:%The MATLAB program for calculating the weight matrix is as follows %Discrete Hopfield net clc; clear; x=[1 1 1 0]; w=(2*x'–1)*(2*x–1); for i=1:4 w (i, i)=0; end disp('Weight matrix'); disp(w); Output:- Experiment:- 15 GJIMT || 2022 Aim:- Construct and test auto associative network for input vector using outer product rule. Code:%Auotassociative net to store the vector clc; clear; x = [1 1 –1 –1]; w=zeros (4, 4); w=x'*x; yin=x*w; for i=1:4 if yin(i)>0 y(i)=1; else y(i) = –1; end end disp ('Weight matrix'); disp (w); if x == y disp ('The vector is a Known Vector'); else disp ('The vector is a Unknown Vector'); end Output:- GJIMT || 2022 Experiment:- 16 Aim:- Construct and test heteroassociative network for binary inputs and targets. Code:# Import Python Libraries import numpy as np # Take two sets of patterns: # Set A: Input Pattern x1 = np.array([1, 1, 1, 1, 1, 1]).reshape(6, 1) x2 = np.array([-1, -1, -1, -1, -1, -1]).reshape(6, 1) x3 = np.array([1, 1, -1, -1, 1, 1]).reshape(6, 1) x4 = np.array([-1, -1, 1, 1, -1, -1]).reshape(6, 1) # Set B: Target Pattern y1 = np.array([1, 1, 1]).reshape(3, 1) y2 = np.array([-1, -1, -1]).reshape(3, 1) y3 = np.array([1, -1, 1]).reshape(3, 1) y4 = np.array([-1, 1, -1]).reshape(3, 1) ''' print("Set A: Input Pattern, Set B: Target Pattern") print("\nThe input for pattern 1 is") print(x1) print("\nThe target for pattern 1 is") print(y1) print("\nThe input for pattern 2 is") print(x2) print("\nThe target for pattern 2 is") print(y2) print("\nThe input for pattern 3 is") print(x3) print("\nThe target for pattern 3 is") print(y3) print("\nThe input for pattern 4 is") print(x4) print("\nThe target for pattern 4 is") print(y4) print("\n------------------------------") ''' # Calculate weight Matrix: W inputSet = np.concatenate((x1, x2, x3, x4), axis = 1) targetSet = np.concatenate((y1.T, y2.T, y3.T, y4.T), axis = 0) GJIMT || 2022 print("\nWeight matrix:") weight = np.dot(inputSet, targetSet) print(weight) print("\n------------------------------") # Testing Phase # Test for Input Patterns: Set A print("\nTesting for input patterns: Set A") def testInputs(x, weight): # Multiply the input pattern with the weight matrix # (weight.T X x) y = np.dot(weight.T, x) y[y < 0] = -1 y[y >= 0] = 1 return np.array(y) print("\nOutput of input pattern 1") print(testInputs(x1, weight)) print("\nOutput of input pattern 2") print(testInputs(x2, weight)) print("\nOutput of input pattern 3") print(testInputs(x3, weight)) print("\nOutput of input pattern 4") print(testInputs(x4, weight)) # Test for Target Patterns: Set B print("\nTesting for target patterns: Set B") def testTargets(y, weight): # Multiply the target pattern with the weight matrix # (weight X y) x = np.dot(weight, y) x[x <= 0] = -1 x[x > 0] = 1 return np.array(x) print("\nOutput of target pattern 1") print(testTargets(y1, weight)) print("\nOutput of target pattern 2") print(testTargets(y2, weight)) print("\nOutput of target pattern 3") print(testTargets(y3, weight)) print("\nOutput of target pattern 4") print(testTargets(y4, weight)) Output:- GJIMT || 2022 Experiment:- 17 GJIMT || 2022 Aim:- Create a back propagation network for a given input pattern. Perform 3 epochs of operation. Code:import numpy as np def sigmoid(x): return 1.0/(1.0 + np.exp(-x)) def sigmoid_prime(x): return sigmoid(x)*(1.0-sigmoid(x)) def tanh(x): return np.tanh(x) def tanh_prime(x): return 1.0 - x**2 class NeuralNetwork: def __init__(self, layers, activation='tanh'): if activation == 'sigmoid': self.activation = sigmoid self.activation_prime = sigmoid_prime elif activation == 'tanh': self.activation = tanh self.activation_prime = tanh_prime # Set weights self.weights = [] # layers = [2,2,1] # range of weight values (-1,1) # input and hidden layers - random((2+1, 2+1)) : 3 x 3 for i in range(1, len(layers) - 1): r = 2*np.random.random((layers[i-1] + 1, layers[i] + 1)) -1 self.weights.append(r) # output layer - random((2+1, 1)) : 3 x 1 r = 2*np.random.random( (layers[i] + 1, layers[i+1])) - 1 self.weights.append(r) def fit(self, X, y, learning_rate=0.2, epochs=100000): # Add column of ones to X # This is to add the bias unit to the input layer ones = np.atleast_2d(np.ones(X.shape[0])) X = np.concatenate((ones.T, X), axis=1) for k in range(epochs): i = np.random.randint(X.shape[0]) GJIMT || 2022 a = [X[i]] for l in range(len(self.weights)): dot_value = np.dot(a[l], self.weights[l]) activation = self.activation(dot_value) a.append(activation) # output layer error = y[i] - a[-1] deltas = [error * self.activation_prime(a[-1])] # we need to begin at the second to last layer # (a layer before the output layer) for l in range(len(a) - 2, 0, -1): deltas.append(deltas[1].dot(self.weights[l].T)*self.activation_prime(a[l])) # reverse # [level3(output)->level2(hidden)] >level3(output)] deltas.reverse() => [level2(hidden)- # backpropagation # 1. Multiply its output delta and input activation # to get the gradient of the weight. # 2. Subtract a ratio (percentage) of the gradient from the weight. for i in range(len(self.weights)): layer = np.atleast_2d(a[i]) delta = np.atleast_2d(deltas[i]) self.weights[i] += learning_rate * layer.T.dot(delta) if k % 10000 == 0: print ('epochs:', k) def predict(self, x): a = np.concatenate((np.ones(1).T, np.array(x)), axis=1) for l in range(0, len(self.weights)): a = self.activation(np.dot(a, self.weights[l])) return a if __name__ == '__main__': nn = NeuralNetwork([2,2,1]) X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) y = np.array([0, 1, 1, 0]) nn.fit(X, y) for e in X: GJIMT || 2022 print(e,nn.predict(e)) Output:- Experiment:- 18 GJIMT || 2022 Aim:- Implement Union, Intersection, Complement and Difference operations on fuzzy sets. Also create fuzzy relation by Cartesian product of any two fuzzy sets and perform maxmin composition on any two fuzzy relations. Fuzzy Sets:- Fuzzy refers to something that is unclear or vague . Hence, Fuzzy Set is a Set where every key is associated with value, which is between 0 to 1 based on the certainty .This value is often called as degree of membership. Fuzzy Set is denoted with a Tilde Sign on top of the normal Set notation. Operations on Fuzzy Set with Code :- Union : Code:# Example to Demonstrate the # Union of Two Fuzzy Sets A = dict() B = dict() Y = dict() A = {"a": 0.2, "b": 0.3, "c": 0.6, "d": 0.6} B = {"a": 0.9, "b": 0.9, "c": 0.4, "d": 0.5} print('The First Fuzzy Set is :', A) print('The Second Fuzzy Set is :', B) for A_key, B_key in zip(A, B): A_value = A[A_key] B_value = B[B_key] if A_value > B_value: Y[A_key] = A_value else: Y[B_key] = B_value print('Fuzzy Set Union is :', Y) Output:- GJIMT || 2022 Intersection : Code:# Example to Demonstrate # Intersection of Two Fuzzy Sets A = dict() B = dict() Y = dict() A = {"a": 0.2, "b": 0.3, "c": 0.6, "d": 0.6} B = {"a": 0.9, "b": 0.9, "c": 0.4, "d": 0.5} print('The First Fuzzy Set is :', A) print('The Second Fuzzy Set is :', B) for A_key, B_key in zip(A, B): A_value = A[A_key] B_value = B[B_key] if A_value < B_value: Y[A_key] = A_value else: Y[B_key] = B_value print('Fuzzy Set Intersection is :', Y) Output:- Complement : Code:# Example to Demonstrate the # Complement Between Two Fuzzy Sets A = dict() Y = dict() A = {"a": 0.2, "b": 0.3, "c": 0.6, "d": 0.6} print('The Fuzzy Set is :', A) for A_key in A: GJIMT || 2022 Y[A_key]= 1-A[A_key] print('Fuzzy Set Complement is :', Y) Output:- Difference: Code:# Example to Demonstrate the # Difference Between Two Fuzzy Sets A = dict() B = dict() Y = dict() A = {"a": 0.2, "b": 0.3, "c": 0.6, "d": 0.6} B = {"a": 0.9, "b": 0.9, "c": 0.4, "d": 0.5} print('The First Fuzzy Set is :', A) print('The Second Fuzzy Set is :', B) for A_key, B_key in zip(A, B): A_value = A[A_key] B_value = B[B_key] B_value = 1 - B_value if A_value < B_value: Y[A_key] = A_value else: Y[B_key] = B_value print('Fuzzy Set Difference is :', Y) Output:- GJIMT || 2022 Cartesian Product & MaxMin Composition: Code:def cartesian(): n = int(input("\nEnter number of elements in first set (A): ")) A = [] B = [] print("Enter elements for A:") for i in range(0, n): ele = float(input()) A.append(ele) m = int(input("\nEnter number of elements in second set (B): ")) print("Enter elements for B:") for i in range(0, m): ele = float(input()) B.append(ele) print("A = {"+str(A)[1:-1]+"}") print("B = {"+str(B)[1:-1]+"}") cart_prod = [] cart_prod = [[0 for j in range(m)]for i in range(n)] for i in range(n): for j in range(m): cart_prod[i][j] = min(A[i],B[j]) print("A x B = ") for i in range(n): for j in range(m): print(cart_prod[i][j],end=" ") print("\n") return def minmax(): r1 = int(input("Enter number of rows of first relation (R1): ")) c1 = int(input("Enter number of columns of first relation (R1): ")) rel1=[[0 for i in range(c1)]for j in range(r1)] print("Enter the elments for R:") for i in range(r1): for j in range(c1): rel1[i][j]=float(input()) r2 = int(input("Enter number of rows of second relation (R2): ")) c2 = int(input("Enter number of columns of second relation (R2): ")) rel2=[[0 for i in range(c2)]for j in range(r2)] print("Enter the elments for R:") for i in range(r2): for j in range(c2): GJIMT || 2022 rel2[i][j]=float(input()) print("\nR1 = ") for i in range(r1): for j in range(c1): print(rel1[i][j],end=" ") print("\n") print("\nR2 = ") for i in range(r2): for j in range(c2): print(rel2[i][j],end=" ") print("\n") col=0 comp=[] for i in range(r1): comp.append([]) for j in range(c2): l=[] for k in range(r2): l.append(min(rel1[i][k],rel2[k][j])) comp[i].append(max(l)) print("\nR1 composition R2 =") for i in range(r1): for j in range(c2): print(comp[i][j],end=" ") print("\n") return ch=1 while ch==1: print("MENU:\n----\n1->Cartesian Product\n2->Minmax Composition\n3->Exit") op=int(input("Enter Your Choice: ")) if op==1: cartesian() elif op==2: minmax() elif op==3: break else: print("Wrong Choice!") ch=int(input("Do you wish to continue (1-Yes | 0-No): ")) print("\n") GJIMT || 2022 Output:- Cartesian Product Output:- MaxMin Composition GJIMT || 2022 Experiment:- 19 Aim:- Maximize the function f(x)=x2 using GA, where x ranges form 0-25. Perform 6 iterations. Code:- %program for Genetic algorithm to maximize the function f(x) =sin(x) clear all; clc; %x ranges from 0 to 3.14 %five bits are enough to represent x in binary representation n=input('Enter no. of population in each iteration'); nit=input('Enter no. of iterations'); %Generate the initial population [oldchrom]=initbp(n,5); %The population in binary is converted to integer FieldD=[5;0;3.14;0;0;1;1] for i=1:nit phen=bindecod(oldchrom,FieldD,3);% phen gives the integer value of the %binary population %obtain fitness value FitnV=sin(phen); %apply roulette wheel selection GJIMT || 2022 Nsel=4; newchrix=selrws(FitnV, Nsel); newchrom=oldchrom(newchrix,:); %Perform Crossover crossoverrate=1; newchromc=recsp(newchrom,crossoverrate);%new population crossover %Perform mutation vlub=0:31; mutationrate=0.001; newchromm=mutrandbin(newchromc,vlub,mutationrate);%new population %after mutation disp('For iteration'); i disp('Population'); oldchrom disp('X'); phen disp('f(X)'); FitnV oldchrom=newchromm; end Output:- after GJIMT || 2022 -: THE END :-