-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathperceptron-python
More file actions
218 lines (218 loc) · 28 KB
/
perceptron-python
File metadata and controls
218 lines (218 loc) · 28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
{
"cells": [
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"from numpy import array, dot, random\n",
"from random import choice\n",
"from matplotlib import pyplot as plt\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {},
"outputs": [],
"source": [
"\n",
"# Your goal is to complete this function by writing the necessary functions\n",
"#Input parameters\n",
"# X: training data matrix. Here, X is an mxn matrix (a 2D numpy array), \n",
"# where each row represents a trining example and each column represents a feature. \n",
"# Y: expected output for the training data. In our examples, Y is an mx1 vector\n",
"# eta: learning rate\n",
"# epochs: number of iterations\n",
"\n",
"#task1\n",
"def InitWeight(X):\n",
" r = []\n",
" for i in range(X.shape[1]):\n",
" r.append(random.uniform(-1,1))\n",
" return r \n",
" \n",
" \n",
"#task2\n",
"def WeightedSUM(w,x):\n",
" return np.dot(w,x)\n",
"\n",
"#task3 \n",
"def UnitStep(w_sum):\n",
" if w_sum >= 0:\n",
" return 1\n",
" else:\n",
" return 0\n",
"#task3\n",
"def ComputeError(y,y_pred):\n",
" return (y-y_pred)\n",
"\n",
"#task4\n",
"def UpdateWeight(w,eta,error,x):\n",
" w+=eta*error*x\n",
" return w \n",
"\n",
"#def ComputeAccuracy(X,Y,w):\n",
"def ComputeAccuracy(Pred,Y):\n",
" count = 0\n",
" for i in range(len(Pred)):\n",
" if(Pred[i] == Y[i]):\n",
" count = count + 1\n",
" return float(count/len(Pred))\n",
" \n",
"def PlotAccuracy(accuracy, epochs):\n",
" plt.plot(range(epochs), accuracy)\n",
" plt.show()\n",
" return\n",
"\n",
"def perceptron_training(X,Y, eta, epochs):\n",
" \n",
" #Task 1: randomly initialize the weights \n",
" # what is the shape of the weight array w? Get this information from X \n",
" w = InitWeight(X) # write this InitWeight function\n",
" #print(w)\n",
" accuracy = []\n",
" # Run iterations\n",
" for i in range(epochs):\n",
" predictions = []\n",
" # in eveery iteration train for every training examples\n",
" for x, y in zip(X, Y):\n",
" \n",
" # Task 2: Compute weighted sum based on w and x\n",
" \n",
" w_sum = WeightedSUM(w,x) # write this WeightedSUM function\n",
" # Task 3: Use a step function to get the predicted output \n",
" \n",
" y_pred = UnitStep(w_sum) # write this UnitStep function\n",
" # Task 3: Compute error (predicted-expected output)\n",
"\n",
" error = ComputeError(y,y_pred) # write this ComputeError function\n",
" # Task 4: update weights\n",
" w = UpdateWeight(w,eta,error,x) # write this UpdateWeight function\n",
" \n",
" #print(y_pred)\n",
" predictions.append(y_pred)\n",
" #print(error)\n",
" \n",
" \n",
" # Task 5: Compute accuracy of your current model\n",
" # The accuracy computation is similar to the above operation (except that you don't update weights)\n",
" # The accuracy should be normalized (0<= accuracy <= 1)\n",
" #print(predictions)\n",
" acc = ComputeAccuracy(predictions, Y)\n",
" #ComputeAccuracy(X,Y,w) # write this ComputeAccuracy function (you can use WeightedSUM and UnitStep functions)\n",
" accuracy.append(acc)\n",
" \n",
" # Task 6: plot accuracy\n",
" #print(accuracy)\n",
" PlotAccuracy(accuracy, epochs) # # write this functions\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1658e8304a8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Testing your code:\n",
"# learn the binary OR function\n",
"# we added an extra 1 to remove bias\n",
"# you can try removing the eextra 1 to see how the accuracy is affected\n",
"OR_X = np.array([[0,0,1], [0,1,1],[1,0,1],[1,1,1]])\n",
"OR_Y = np.array([0,1,1,1])\n",
"perceptron_training(OR_X,OR_Y, .2, 100)\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# The accuracy is less till the 4th epoch and later the perceptron predicted the correct output"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Shape of X: (569, 30)\n",
"Shape of Y: (569,)\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1658edf6a90>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Testing your code with real data:\n",
"# You may have to install sklearn\n",
"import sklearn.datasets\n",
"breast_cancer = sklearn.datasets.load_breast_cancer()\n",
"X = breast_cancer.data\n",
"Y = breast_cancer.target\n",
"print (\"Shape of X:\", X.shape)\n",
"print (\"Shape of Y:\", Y.shape)\n",
"perceptron_training(X,Y, .2, 1000)\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# The Perceptron improved accurcy over the first 100 epochs and later it and carried the accuracy of around 90% "
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}