Add LICENSE.txt with GPL-3.0-or-later license
This commit is contained in:
+120
@@ -0,0 +1,120 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for software.
|
||||
By contrast, the GPL guarantees your freedom to share and change all versions.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you these rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License.
|
||||
|
||||
Some devices are designed to deny users access to install or run modified versions.
|
||||
This is fundamentally incompatible with the aim of protecting users' freedom to change software.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
The GPL assures that patents cannot be used to render the program non-free.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of works.
|
||||
"The Program" refers to any copyrightable work licensed under this License.
|
||||
|
||||
1. Source Code.
|
||||
The "source code" for a work means the preferred form for making modifications.
|
||||
|
||||
2. Basic Permissions.
|
||||
All rights granted under this License are granted for the term of copyright on the Program,
|
||||
and are irrevocable provided the stated conditions are met.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
No covered work shall be deemed part of an effective technological measure.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
You may convey verbatim copies of the Program's source code as you receive it.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
You may convey a work based on the Program under section 4, provided that you also meet all conditions:
|
||||
a) The work must carry prominent notices stating that you modified it.
|
||||
b) You must license the entire work under this License.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
You may convey a covered work in object code form under sections 4 and 5, provided that you also convey
|
||||
the machine-readable Corresponding Source under the terms of this License.
|
||||
|
||||
7. Additional Terms.
|
||||
"Additional permissions" are terms that supplement the terms of this License by making exceptions.
|
||||
|
||||
8. Termination.
|
||||
You may not propagate or modify a covered work except as expressly provided under this License.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
You are not required to accept this License in order to receive or run a copy of the Program.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
Each time you convey a covered work, the recipient automatically receives a license from the original licensors.
|
||||
|
||||
11. Patents.
|
||||
A "contributor" is a copyright holder who authorizes use under this License of the Program.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
If conditions are imposed on you that contradict the conditions of this License, they do not excuse you from the conditions.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
You have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
|
||||
16. Limitation of Liability.
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER BE LIABLE TO YOU FOR DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest possible use to the public,
|
||||
the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program:
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
========================================================================
|
||||
|
||||
Copyright (C) YOUR NAME 2024
|
||||
|
||||
Licensed under the GNU General Public License Version 3 (GPL-3.0-or-later).
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GPL v3 as published by the Free Software Foundation,
|
||||
either version 3 of the License, or (at your option) any later version.
|
||||
|
||||
See <https://www.gnu.org/licenses/> for full license text.
|
||||
-231
@@ -1,231 +0,0 @@
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
from sklearn.cluster import KMeans
|
||||
from sklearn.metrics import confusion_matrix
|
||||
from sklearn.ensemble import RandomForestClassifier
|
||||
from sklearn.naive_bayes import GaussianNB
|
||||
import matplotlib.pyplot as plt
|
||||
from sklearn import svm
|
||||
from pprint import pprint
|
||||
import os
|
||||
import seaborn as sn
|
||||
|
||||
def normalized(a, axis=-1, order=2):
|
||||
return a / sum(a)
|
||||
|
||||
def get_activities(dir):
|
||||
activity_data_train = {}
|
||||
activity_data_test = {}
|
||||
i= 0
|
||||
for root, dirs, files in os.walk(dir):
|
||||
|
||||
activity_name = root.split('\\')[1]
|
||||
activity_data_train[activity_name] = []
|
||||
activity_data_test[activity_name] = []
|
||||
for i in range(int(.8 * len(files))):
|
||||
data = pd.read_csv(os.path.join(root, files[i]), delimiter=' ').values.flatten()
|
||||
activity_data_train[activity_name].append(data)
|
||||
i+=1
|
||||
while i < len(files):
|
||||
data = pd.read_csv(os.path.join(root, files[i]), delimiter=' ').values.flatten()
|
||||
activity_data_test[activity_name].append(data)
|
||||
i+=1
|
||||
|
||||
return activity_data_train, activity_data_test
|
||||
|
||||
def quantize_data(data, vector_len):
|
||||
del data[""]
|
||||
print("quantizing", data)
|
||||
print(vector_len)
|
||||
quantized_data = {}
|
||||
total = 0
|
||||
total2 = 0
|
||||
for key, value in data.items():
|
||||
|
||||
print(key, len(value))
|
||||
quantized_data[key] = {}
|
||||
print(vector_len)
|
||||
for i in range(len(value)):
|
||||
total2+= len(value[i])/vector_len
|
||||
while(len(value[i]) %vector_len != 0):
|
||||
value[i] = value[i][:-1]
|
||||
print(len(value[i]), vector_len)
|
||||
new_data = np.split(value[i], len(value[i]) / vector_len)
|
||||
# if len(new_data[len(new_data) - 1]) != vector_len:
|
||||
# print(vector_len,len(new_data[len(new_data) - 1]))
|
||||
# del new_data[len(new_data) - 1]
|
||||
quantized_data[key][i] = new_data
|
||||
total+= len(new_data)
|
||||
|
||||
|
||||
print("Total is:", total, total2)
|
||||
|
||||
return quantized_data
|
||||
|
||||
lengths = [4]
|
||||
# for i in range(3,4):
|
||||
# lengths.append((i+1)*21)
|
||||
data_train, data_test = get_activities('data\\')
|
||||
print("----------------")
|
||||
|
||||
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
|
||||
|
||||
# print(X)
|
||||
clusters =[1000]# [600,600,600,1000,1000,1000,1400,1400,1400]
|
||||
q_count = 0
|
||||
n_count = 0
|
||||
accuracies = []
|
||||
for quantize_length in lengths:
|
||||
accuracies.append([])
|
||||
for num_clusters in clusters:
|
||||
|
||||
qdata_test = quantize_data(data_test, quantize_length)
|
||||
print("----------------")
|
||||
qdata_train = quantize_data(data_train, quantize_length)
|
||||
print("----------------")
|
||||
#fill kmeans_data with all of the data of all of the exercises reguardless of what they are
|
||||
k_means_data = None
|
||||
|
||||
for exercise_name, exercise_data in qdata_train.items():
|
||||
for example_number, example_data in exercise_data.items():
|
||||
if k_means_data is None:
|
||||
k_means_data = np.array(example_data)
|
||||
else:
|
||||
# print(k_means_data.shape)
|
||||
# print( np.atleast_1d(part).shape)
|
||||
# print( np.atleast_2d(part).shape)
|
||||
k_means_data = np.concatenate((k_means_data,np.array(example_data)), axis=0)
|
||||
|
||||
print(len(k_means_data[0]))
|
||||
print(len(k_means_data[:,0]))
|
||||
|
||||
|
||||
print("training the model")
|
||||
kmeans = KMeans(n_clusters=num_clusters, n_init=15, max_iter= 500).fit(k_means_data)
|
||||
|
||||
print("Done training model")
|
||||
centers = kmeans.cluster_centers_
|
||||
#Time to run the training by again and make the histograms for each training data point.
|
||||
classifier_training_X = []
|
||||
classifier_training_Y = []
|
||||
|
||||
# print("creating histograms for training")
|
||||
for exercise_name, exercise_data in qdata_train.items():
|
||||
for example_number, example_data in exercise_data.items():
|
||||
center_histo = np.zeros((num_clusters,))
|
||||
center_indices = kmeans.predict(example_data)
|
||||
for i in center_indices:
|
||||
center_histo[i] += 1
|
||||
classifier_training_X.append(normalized(center_histo))
|
||||
classifier_training_Y.append(exercise_name)
|
||||
|
||||
|
||||
# print("done")
|
||||
|
||||
classifier_test_X = []
|
||||
classifier_test_Y = []
|
||||
# print("creating histograms for testing")
|
||||
for exercise_name, exercise_data in qdata_test.items():
|
||||
for example_number, example_data in exercise_data.items():
|
||||
center_histo = np.zeros((num_clusters,))
|
||||
center_indices = kmeans.predict(example_data)
|
||||
for i in center_indices:
|
||||
center_histo[i] += 1
|
||||
classifier_test_X.append(normalized(center_histo))
|
||||
classifier_test_Y.append(exercise_name)
|
||||
|
||||
# print(classifier_test_Y)
|
||||
|
||||
print("done")
|
||||
forest_average = []
|
||||
for g in range(1):
|
||||
clf = RandomForestClassifier(n_estimators=(50)*2)
|
||||
clf.fit(classifier_training_X, classifier_training_Y)
|
||||
|
||||
results = clf.predict(classifier_test_X)
|
||||
print(results)
|
||||
i = 0
|
||||
#
|
||||
#
|
||||
con_mat = confusion_matrix(results, classifier_test_Y)
|
||||
print(con_mat)
|
||||
|
||||
np.savetxt("con_mat.csv", con_mat, '%5.0f', delimiter=",\t")
|
||||
|
||||
wrong = 0
|
||||
right = 0
|
||||
for i in range(len(con_mat)):
|
||||
for j in range(len(con_mat[0])):
|
||||
if i != j:
|
||||
wrong += con_mat[i][j]
|
||||
else:
|
||||
right += con_mat[i][j]
|
||||
|
||||
# print(right/len(results))
|
||||
# print((g+1)*2)
|
||||
forest_average.append(right/len(results))
|
||||
print("Random Forest Average Accuracy:")
|
||||
print(sum(forest_average) / len(forest_average))
|
||||
print("SVM Average Accuracy:")
|
||||
clf = svm.LinearSVC()
|
||||
clf.fit(classifier_training_X, classifier_training_Y)
|
||||
|
||||
results = clf.predict(classifier_test_X)
|
||||
# print(results)
|
||||
i = 0
|
||||
|
||||
|
||||
con_mat = confusion_matrix(results, classifier_test_Y)
|
||||
# print(con_mat)
|
||||
|
||||
wrong = 0
|
||||
right = 0
|
||||
for i in range(len(con_mat)):
|
||||
for j in range(len(con_mat[0])):
|
||||
if i != j:
|
||||
wrong += con_mat[i][j]
|
||||
else:
|
||||
right += con_mat[i][j]
|
||||
|
||||
print(right/len(results))
|
||||
|
||||
print("Gaussian Naive Bayes Average Accuracy:")
|
||||
clf = GaussianNB()
|
||||
clf.fit(classifier_training_X, classifier_training_Y)
|
||||
|
||||
results = clf.predict(classifier_test_X)
|
||||
# print(results)
|
||||
i = 0
|
||||
|
||||
|
||||
con_mat = confusion_matrix(results, classifier_test_Y)
|
||||
# print(con_mat)
|
||||
|
||||
wrong = 0
|
||||
right = 0
|
||||
for i in range(len(con_mat)):
|
||||
for j in range(len(con_mat[0])):
|
||||
if i != j:
|
||||
wrong += con_mat[i][j]
|
||||
else:
|
||||
right += con_mat[i][j]
|
||||
|
||||
print(right/len(results))
|
||||
|
||||
accuracies[q_count].append(sum(forest_average) / len(forest_average))
|
||||
print(num_clusters)
|
||||
print(quantize_length)
|
||||
|
||||
n_count+=1
|
||||
n_count = 0
|
||||
q_count +=1
|
||||
|
||||
#Following code copied froms tack overflow for printing out the confusion matrix
|
||||
|
||||
#convert the string into an array
|
||||
df_cm = pd.DataFrame(con_mat, index = [i for i in "ABCDEFGHIJKLMN"],
|
||||
columns = [i for i in "ABCDEFGHIJKLMN"])
|
||||
plt.figure(figsize = (10,7))
|
||||
sn.heatmap(df_cm, annot=True)
|
||||
pprint(accuracies)
|
||||
plt.show()
|
||||
Reference in New Issue
Block a user