Skip to content

Commit 20068d3

Browse files
authored
Merge pull request #14 from jideoyelayo1/clustering
Added Clustering Algorithms
2 parents 7f10daf + 3eb059a commit 20068d3

17 files changed

+1155
-4
lines changed

Diff for: CMakeLists.txt

+29
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,22 @@ add_executable(RandomForestClassifier tests/tree/RandomForestClassifierTest.cpp)
5353
target_compile_definitions(RandomForestClassifier PRIVATE TEST_RANDOM_FOREST_CLASSIFIER)
5454
target_link_libraries(RandomForestClassifier cpp_ml_library)
5555

56+
add_executable(KMeansClustering tests/clustering/KMeansClusteringTest.cpp)
57+
target_compile_definitions(KMeansClustering PRIVATE TEST_KMEANS_CLUSTERING)
58+
target_link_libraries(KMeansClustering cpp_ml_library)
59+
60+
add_executable(KNNClassifier tests/clustering/KNNClassifierTest.cpp)
61+
target_compile_definitions(KNNClassifier PRIVATE TEST_KKN_CLASSIFIER)
62+
target_link_libraries(KNNClassifier cpp_ml_library)
63+
64+
add_executable(KNNRegressor tests/clustering/KNNRegressorTest.cpp)
65+
target_compile_definitions(KNNRegressor PRIVATE TEST_KNN_REGRESSOR)
66+
target_link_libraries(KNNRegressor cpp_ml_library)
67+
68+
add_executable(HierarchicalClustering tests/clustering/HierarchicalClusteringTest.cpp)
69+
target_compile_definitions(HierarchicalClustering PRIVATE TEST_HIERARCHICAL_CLUSTERING)
70+
target_link_libraries(HierarchicalClustering cpp_ml_library)
71+
5672
# Register individual tests
5773
add_test(NAME LogisticRegressionTest COMMAND LogisticRegressionTest)
5874
add_test(NAME PolynomialRegressionTest COMMAND PolynomialRegressionTest)
@@ -61,6 +77,11 @@ add_test(NAME DecisionTreeRegressor COMMAND DecisionTreeRegressor)
6177
add_test(NAME RandomForestRegressor COMMAND RandomForestRegressor)
6278
add_test(NAME DecisionTreeClassifier COMMAND DecisionTreeClassifier)
6379
add_test(NAME RandomForestClassifier COMMAND RandomForestClassifier)
80+
add_test(NAME KMeansClustering COMMAND KMeansClustering)
81+
add_test(NAME KNNClassifier COMMAND KNNClassifier)
82+
add_test(NAME KNNRegressor COMMAND KNNRegressor)
83+
add_test(NAME HierarchicalClustering COMMAND HierarchicalClustering)
84+
6485

6586
# Add example executables if BUILD_EXAMPLES is ON
6687
if(BUILD_EXAMPLES)
@@ -87,6 +108,14 @@ if(BUILD_EXAMPLES)
87108
target_compile_definitions(${EXAMPLE_TARGET} PRIVATE TEST_DECISION_TREE_CLASSIFIER)
88109
elseif(EXAMPLE_NAME STREQUAL "RandomForestClassifierExample")
89110
target_compile_definitions(${EXAMPLE_TARGET} PRIVATE TEST_RANDOM_FOREST_CLASSIFIER)
111+
elseif(EXAMPLE_NAME STREQUAL "KMeansExample")
112+
target_compile_definitions(${EXAMPLE_TARGET} PRIVATE TEST_KMEANS_CLUSTERING)
113+
elseif(EXAMPLE_NAME STREQUAL "KNNClassifierExample")
114+
target_compile_definitions(${EXAMPLE_TARGET} PRIVATE TEST_KKN_CLASSIFIER)
115+
elseif(EXAMPLE_NAME STREQUAL "KNNRegressorExample")
116+
target_compile_definitions(${EXAMPLE_TARGET} PRIVATE TEST_KNN_REGRESSOR)
117+
elseif(EXAMPLE_NAME STREQUAL "HierarchicalClusteringExample")
118+
target_compile_definitions(${EXAMPLE_TARGET} PRIVATE TEST_HIERARCHICAL_CLUSTERING)
90119
endif()
91120
endforeach()
92121
endif()

Diff for: README.md

+6-4
Original file line numberDiff line numberDiff line change
@@ -61,17 +61,19 @@ The following machine learning algorithms are planned, inspired by concepts and
6161
- [x] Polynomial Regression
6262
- [x] Multi-Linear Regression
6363
- [x] Logistic Regression
64-
- [ ] Decision Tree Regression
65-
- [ ] Random Forest Regression
64+
- [x] Decision Tree Regression
65+
- [x] Random Forest Regression
66+
- [ ] K-Nearest Neighbors
6667

6768

6869
2. **Classification**
69-
- [ ] Decision Tree Classifier
70-
- [ ] Random Forest Classifier
70+
- [x] Decision Tree Classifier
71+
- [x] Random Forest Classifier
7172
- [ ] K-Nearest Neighbors
7273

7374
3. **Clustering**
7475
- [ ] K-Means Clustering
76+
- [ ] Hierarchical clustering
7577

7678
4. **Neural Networks**
7779
- [ ] Neural Network (NN)

Diff for: examples/HierarchicalClusteringExample.cpp

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#include "../ml_library_include/ml/clustering/HierarchicalClustering.hpp"
2+
#include <iostream>
3+
4+
int testHierarchicalClustering() {
5+
// Sample data
6+
std::vector<std::vector<double>> data = {
7+
{1.0, 2.0},
8+
{1.5, 1.8},
9+
{5.0, 8.0},
10+
{6.0, 9.0},
11+
{1.0, 0.6},
12+
{9.0, 11.0},
13+
{8.0, 2.0},
14+
{10.0, 2.0},
15+
{9.0, 3.0}
16+
};
17+
18+
// Create and fit the model
19+
HierarchicalClustering hc(3, HierarchicalClustering::Linkage::AVERAGE);
20+
hc.fit(data);
21+
22+
// Get cluster labels
23+
std::vector<int> labels = hc.predict();
24+
25+
// Output cluster labels
26+
for (size_t i = 0; i < labels.size(); ++i) {
27+
std::cout << "Data point " << i << " is in cluster " << labels[i] << std::endl;
28+
}
29+
30+
return 0;
31+
}
32+
33+
int main(){
34+
testHierarchicalClustering();
35+
return 0;
36+
}

Diff for: examples/KMeansExample.cpp

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#include "../ml_library_include/ml/clustering/KMeans.hpp"
2+
#include <iostream>
3+
4+
int testKMeansClustering() {
5+
// Sample data
6+
std::vector<std::vector<double>> X = {
7+
{1.0, 2.0},
8+
{1.5, 1.8},
9+
{5.0, 8.0},
10+
{8.0, 8.0},
11+
{1.0, 0.6},
12+
{9.0, 11.0},
13+
{8.0, 2.0},
14+
{10.0, 2.0},
15+
{9.0, 3.0},
16+
};
17+
18+
// Create and fit the model
19+
KMeans kmeans(3);
20+
kmeans.fit(X);
21+
22+
// Predict cluster labels
23+
std::vector<int> labels = kmeans.predict(X);
24+
25+
// Output results
26+
for (size_t i = 0; i < labels.size(); ++i) {
27+
std::cout << "Point: (" << X[i][0] << ", " << X[i][1] << ") - Cluster: " << labels[i] << std::endl;
28+
}
29+
30+
// Get cluster centers
31+
const auto& centers = kmeans.get_cluster_centers();
32+
for (size_t k = 0; k < centers.size(); ++k) {
33+
std::cout << "Cluster " << k << " center: (" << centers[k][0] << ", " << centers[k][1] << ")" << std::endl;
34+
}
35+
36+
return 0;
37+
}
38+
39+
// Only include main if TEST_DECISION_TREE_REGRESSION is defined
40+
//#ifdef TEST_KMEANS_CLUSTERING
41+
int main() {
42+
testKMeansClustering();
43+
return 0;
44+
}
45+
//#endif

Diff for: examples/KNNClassifierExample.cpp

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#include "../ml_library_include/ml/clustering/KNNClassifier.hpp"
2+
#include <iostream>
3+
4+
int testKNNClassifier() {
5+
// Training data
6+
std::vector<std::vector<double>> X_train = {
7+
{1.0, 2.0},
8+
{1.5, 1.8},
9+
{5.0, 8.0},
10+
{8.0, 8.0},
11+
{1.0, 0.6},
12+
{9.0, 11.0}
13+
};
14+
std::vector<int> y_train = {0, 0, 1, 1, 0, 1};
15+
16+
// Test data
17+
std::vector<std::vector<double>> X_test = {
18+
{1.0, 1.0},
19+
{8.0, 9.0},
20+
{0.0, 0.0}
21+
};
22+
23+
// Create and train the classifier
24+
KNNClassifier knn(3);
25+
knn.fit(X_train, y_train);
26+
27+
// Make predictions
28+
std::vector<int> predictions = knn.predict(X_test);
29+
30+
// Output predictions
31+
for (size_t i = 0; i < predictions.size(); ++i) {
32+
std::cout << "Sample " << i << " predicted class: " << predictions[i] << std::endl;
33+
}
34+
35+
return 0;
36+
}
37+
38+
int main(){
39+
testKNNClassifier();
40+
return 0;
41+
}

Diff for: examples/KNNRegressorExample.cpp

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#include "../ml_library_include/ml/clustering/KNNRegressor.hpp"
2+
#include <iostream>
3+
4+
int testKNNRegressor() {
5+
// Training data
6+
std::vector<std::vector<double>> X_train = {
7+
{1.0},
8+
{2.0},
9+
{3.0},
10+
{4.0},
11+
{5.0}
12+
};
13+
std::vector<double> y_train = {2.0, 3.0, 4.0, 5.0, 6.0};
14+
15+
// Test data
16+
std::vector<std::vector<double>> X_test = {
17+
{1.5},
18+
{2.5},
19+
{3.5}
20+
};
21+
22+
// Create and train the regressor
23+
KNNRegressor knn(2);
24+
knn.fit(X_train, y_train);
25+
26+
// Make predictions
27+
std::vector<double> predictions = knn.predict(X_test);
28+
29+
// Output predictions
30+
for (size_t i = 0; i < predictions.size(); ++i) {
31+
std::cout << "Sample " << i << " predicted value: " << predictions[i] << std::endl;
32+
}
33+
34+
return 0;
35+
}
36+
37+
int main(){
38+
testKNNRegressor();
39+
return 0;
40+
}

0 commit comments

Comments
 (0)