Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implemented Various Distance Metric #107

Open
wants to merge 30 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
4900b40
Resolved Issue #64
Modernbeast02 Feb 7, 2023
341ebc0
Fixed All Operators Issue#64
Modernbeast02 Feb 7, 2023
34f6cc2
Merge branch 'PEC-CSS:main' into main
Modernbeast02 Feb 7, 2023
0c12221
Taken Pull and Merged
Modernbeast02 Feb 7, 2023
d6d077b
Merge branch 'main' of https://github.com/Modernbeast02/PWOC_slowmokit
Modernbeast02 Feb 7, 2023
16031e4
Resolved Issue#81
Modernbeast02 Feb 7, 2023
3fb7402
Revert "Resolved Issue#81"
Modernbeast02 Feb 7, 2023
019f9f2
Resolved Issue #81
Modernbeast02 Feb 7, 2023
e955eee
Merge branch 'main' into Issue
Ishwarendra Feb 8, 2023
9718f25
conflict resolved
Modernbeast02 Feb 8, 2023
c2d485e
conflict resolved
Modernbeast02 Feb 8, 2023
3512f9b
F1 Score #72
Modernbeast02 Feb 10, 2023
5d0550e
Resolved Conflict in matrix.cpp
Modernbeast02 Feb 10, 2023
93d1b7a
Resolved #72
Modernbeast02 Feb 10, 2023
0d73928
Formatted Code
Modernbeast02 Feb 10, 2023
c3fb7c9
f1Score.md
Modernbeast02 Feb 10, 2023
004c5c2
Update f1Score.md
Modernbeast02 Feb 11, 2023
8d19454
Update f1Score.md
Modernbeast02 Feb 11, 2023
2e4d110
Implemented Distance Metric
Modernbeast02 Feb 14, 2023
a55d7cb
Distance Metric
Modernbeast02 Feb 14, 2023
4e01ffb
test
Modernbeast02 Feb 14, 2023
6601058
test
Modernbeast02 Feb 14, 2023
cf7e2c6
Changes in DistanceMetric
Modernbeast02 Feb 14, 2023
313e84e
Changes Part 2, hopefully last
Modernbeast02 Feb 14, 2023
fbbeb70
Distance_metric.md
Modernbeast02 Feb 15, 2023
56ead03
Hope Never Dies
Modernbeast02 Feb 15, 2023
77e2b07
Merge branch 'main' of https://github.com/Modernbeast02/PWOC_slowmokit
Modernbeast02 Feb 15, 2023
deb0d05
Hope is Dead
Modernbeast02 Feb 15, 2023
87d1367
Resolved Conflicts
Modernbeast02 Feb 18, 2023
5c3a18e
Formatted
Modernbeast02 Feb 18, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -63,5 +63,5 @@ add_library(slowmokit
src/slowmokit/methods/metrics/f1score.cpp
src/slowmokit/methods/metrics/mean_squared_error.hpp
src/slowmokit/methods/metrics/mean_squared_error.cpp
src/slowmokit/methods/neighbors/distance_metric/distance_metric.cpp
src/slowmokit/methods/neighbors/distance_metric/distance_metric.hpp)
src/slowmokit/methods/metrics/distance_metric/distance_metric.cpp
src/slowmokit/methods/metrics/distance_metric/distance_metric.hpp)
14 changes: 14 additions & 0 deletions examples/metrics/distance_metric_eg.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// #include "../src/slowmokit/methods/metrics/distance_metric/distance_metric.hpp"


// int main()
// {
// std::vector<double> dist1 = {1, 4, 4, 4};
// std::vector<double> dist2 = {1, 2, 3, 4};
// DistanceMetric Dist(dist1, dist2);
// std::cout << "Minkowski Distance is " << Dist.minkowski(3) << std::endl;
// std::cout << "Euclidean Distance is " << Dist.euclidean() << std::endl;
// std::cout << "Manhattan Distance is " << Dist.manhattan() << std::endl;
// std::cout << "Cosine Similarity is " << Dist.cosineSimilarity() << std::endl;
// return 0;
// }
18 changes: 0 additions & 18 deletions examples/neighbors/distance_metric_eg.cpp

This file was deleted.

72 changes: 72 additions & 0 deletions src/slowmokit/methods/metrics/distance_metric/distance_metric.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
/**
* @file methods/metrics/distance_metric/distance_metric.hpp
*
* Easy include to calculate distance metrics
*/

#include "distance_metric.hpp"

template<class T>
DistanceMetric<T>::DistanceMetric(std::vector<T> &x, std::vector<T> &y)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
DistanceMetric<T>::DistanceMetric(std::vector<T> &x, std::vector<T> &y)
DistanceMetric<T>::DistanceMetric(const std::vector<T> &x, const std::vector<T> &y)

We don't want user to feel insecure about their data. Use const. (No need to update in .hpp file)

const in cpp but not in hpp?

.hpp file

void f(int);

.cpp file

void f(const int param1) {
   return;
}

is valid and recommended.

{
this->x = x;
this->y = y;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
DistanceMetric<T>::DistanceMetric(std::vector<T> &x, std::vector<T> &y)
{
this->x = x;
this->y = y;
DistanceMetric<T>::DistanceMetric(std::vector<T> &x, std::vector<T> &y) : x(x), y(y)
{

Use initialiser list, they are faster.

if (x.size() != y.size())
{
throw std::domain_error("Size of the two vectors must be same");
}
}

template<class T> T DistanceMetric<T>::euclidean()
{
T distance = 0;
uttammittal02 marked this conversation as resolved.
Show resolved Hide resolved
int n = x.size();
for (int i = 0; i < n; i++)
{
distance += (x[i] - y[i]) * (x[i] - y[i]);
}
return std::sqrt(distance);
}

template<class T> T DistanceMetric<T>::manhattan()
{
T distance = 0;
int n = x.size();
for (int i = 0; i < n; i++)
{
distance += std::abs(x[i] - y[i]);
}
return distance;
}
template<class T> T DistanceMetric<T>::minkowski(int power)
{
T distance = 0;
int n = x.size();
for (int i = 0; i < n; i++)
{
distance += std::pow(x[i] - y[i], power);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use std::abs(x[i] - y[i]) instead.
Otherwise there might be a problem in case of odd values of p.

}
return std::pow(distance, 1.0 / power);
}

template<class T> T DistanceMetric<T>::magnitude(std::vector<T> &x)
{
T result = 0;
int n = x.size();
for (int i = 0; i < n; i++)
{
result += std::pow(x[i], 2);
uttammittal02 marked this conversation as resolved.
Show resolved Hide resolved
}
return std::sqrt(result);
}

template<class T> T DistanceMetric<T>::cosineSimilarity()
{
T dotProduct = 0;
int n = x.size();
for (int i = 0; i < n; i++)
{
dotProduct += x[i] * y[i];
}
return dotProduct / (magnitude(x) * magnitude(y));
}
58 changes: 58 additions & 0 deletions src/slowmokit/methods/metrics/distance_metric/distance_metric.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
/**
* @file methods/metrics/distance_metric/distance_metric.hpp
*
* Easy include to calculate distances
*/

#ifndef SLOWMOKIT_DISTANCE_METRIC_HPP
#define SLOWMOKIT_DISTANCE_METRIC_HPP
#include "../../../core.hpp"

/**
* Takes predicted and actual values of classes
* @param x
* @param y
Comment on lines +13 to +14
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add short statement describing x and y

* @returns the distance metrics
* @throws domain_error exception when size of the two vectors is not equal
*/
template<class T> class DistanceMetric
{
private:
std::vector<T> x;
std::vector<T> y;

public:
DistanceMetric(std::vector<T> &x, std::vector<T> &y);

/**
* @returns euclidean distance between the two vectors
*/
T euclidean();


/**
* @returns manhattan distance between the two vectors
*/
T manhattan();


/**
* @param power The order of the norm
* @returns minkowski distance between the two vectors
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
* @returns minkowski distance between the two vectors
* @returns minkowski distance between the two vectors
* @throws ...

power < 1 is not allowed..

*/
T minkowski(int);

/**
* @brief to find the magnitude of the vector
* @param x a vector
* @returns magnitude of x
*/
T magnitude(std::vector<T> &);

/**
* @returns cosine similarity between the two vectors
*/
T cosineSimilarity();
};

#endif // SLOWMOKIT_DISTANCE_METRIC_HPP

This file was deleted.

This file was deleted.