Python implementation of TOPSIS for multi-criteria decision making
Project description
topsis-python
Package Description
Python package implementing TOPSIS (Technique for Order of Preference by Similarity to Ideal Solution) for ranking machine learning models and multi-criteria decision making.
Author: Raunaq Mittal
Roll No: 102303752
Overview
TOPSIS is a powerful multi-criteria decision-making algorithm that helps rank alternatives based on their similarity to an ideal solution. This package provides an easy-to-use implementation for evaluating and ranking options across multiple criteria.
Detailed Methodology
What is TOPSIS?
TOPSIS (Technique for Order of Preference by Similarity to Ideal Solution) is a multi-criteria decision-making (MCDM) method that ranks alternatives based on their distance from ideal and anti-ideal solutions. It's widely used for:
- Ranking machine learning models
- Evaluating investment options (mutual funds, portfolios)
- Comparing software alternatives
- Singer/Artist performance evaluation
- Multi-attribute performance analysis
Mathematical Process
Step 1: Decision Matrix Formation
The algorithm begins with a decision matrix containing:
- m alternatives (rows) - the options being evaluated (e.g., M1, M2, M3, or S1, S2, S3...)
- n criteria (columns) - the evaluation attributes (e.g., accuracy, correlation, RMSE, price)
Example decision matrix:
Criterion1 Criterion2 Criterion3
Option1 0.83 0.69 5.8
Option2 0.83 0.69 5.8
Option3 0.84 0.71 3.7
Input Requirements:
- CSV file with first column as alternative IDs
- Numerical values for all criteria
- Weights array (sum should equal 1.0)
- Impacts array ('+' for benefit, '-' for cost)
Step 2: Normalization
Vector normalization is applied to each column to make different criteria comparable on a 0-1 scale:
$$N_{ij} = \frac{X_{ij}}{\sqrt{\sum_{i=1}^{m} X_{ij}^2}}$$
Purpose: Converts different measurement units to a common scale without distorting differences in magnitude.
Step 3: Weighted Normalization
Each normalized value is multiplied by its criterion weight to reflect importance:
$$W_{ij} = N_{ij} \times w_j$$
Where w_j is the weight assigned to criterion j.
Example: If accuracy has weight 0.3 and is normalized to 0.5, weighted value = 0.5 × 0.3 = 0.15
Step 4: Identify Ideal Solutions
Determine ideal best (PIS) and ideal worst (NIS) solutions based on impact direction:
For benefit criteria (+):
- Best value = Maximum weighted normalized value
- Worst value = Minimum weighted normalized value
For cost criteria (-):
- Best value = Minimum weighted normalized value
- Worst value = Maximum weighted normalized value
Step 5: Compute Separation Measures
Calculate Euclidean distances from each alternative to ideal solutions:
$$S_i^+ = \sqrt{\sum_{j=1}^{n} (W_{ij} - W_j^+)^2}$$
$$S_i^- = \sqrt{\sum_{j=1}^{n} (W_{ij} - W_j^-)^2}$$
Where:
- $S_i^+$ = distance to ideal best solution
- $S_i^-$ = distance to ideal worst solution
Step 6: Calculate Performance Score
Calculate relative closeness to ideal solution (ranges from 0 to 1):
$$P_i = \frac{S_i^-}{S_i^+ + S_i^-}$$
Interpretation:
- Score close to 1: Alternative is close to ideal solution (good)
- Score close to 0: Alternative is close to worst solution (poor)
Step 7: Rank Alternatives
Alternatives are ranked in descending order by performance score. The highest-scoring alternative is the best choice.
Installation
pip install topsis-python-raunaqmittal
Usage
Command Line Usage
python -m topsis.topsis <InputDataFile> <Weights> <Impacts> [Verbose(optional)]
Parameters:
InputDataFile: Path to CSV file with decision matrixWeights: Comma-separated weights (e.g., 0.2,0.25,0.15,0.25,0.15)Impacts: Comma-separated impacts (e.g., +,+,-,+,-)Verbose(optional): Any value to display all intermediate matrices
Example
python -m topsis.topsis test_files/topsis2.csv "0.25,0.25,0.2,0.3" "+,+,-,+"
Python API Usage
from topsis.topsis import topsis
# Create TOPSIS instance
t = topsis(
file='test_files/topsis2.csv',
weights=[0.25, 0.25, 0.2, 0.3],
impacts=['+', '+', '-', '+']
)
# Run TOPSIS algorithm
t.topsis_main(debug=True)
# Display detailed results
t.display()
Results
Result Table
The algorithm outputs a ranking table showing each alternative with its corresponding rank:
Models/id Ranks
0 M1 5
1 M2 2
2 M3 8
3 M4 1
4 M5 3
5 M6 4
6 M7 6
7 M8 7
8 M9 9
Interpretation:
- Rank 1 (M4): Best performing alternative
- Rank 9 (M9): Worst performing alternative
- Intermediate ranks show relative performance levels
Performance Scores
Each alternative receives a performance score from 0 to 1:
| Alternative | Performance Score | Rank |
|---|---|---|
| M4 | 0.892 | 1 |
| M2 | 0.756 | 2 |
| M5 | 0.654 | 3 |
| M6 | 0.521 | 4 |
| M1 | 0.498 | 5 |
| M7 | 0.412 | 6 |
| M8 | 0.336 | 7 |
| M3 | 0.189 | 8 |
| M9 | 0.145 | 9 |
Result Visualization
Output Example 1
This screenshot shows the TOPSIS algorithm execution with:
- Input data matrix (normalized and weighted)
- Ideal best and worst solutions
- Distance calculations (S+ and S-)
- Performance scores and final rankings
Output Example 2
Additional detailed analysis showing:
- Intermediate matrix computations
- Separation measures visualization
- Comprehensive ranking breakdown
Output Example 3
Web application visualization showing:
- TOPSIS results displayed in bar chart format
- Alternative rankings with corresponding scores
- Real-time results from Flask web interface
Data Format
Input CSV Format
The input CSV file should have the following structure:
ID,Criterion1,Criterion2,Criterion3,Criterion4
M1,0.83,0.69,5.8,41.4
M2,0.83,0.69,5.8,63.0
M3,0.84,0.71,3.7,32.5
Requirements:
- First column: Alternative identifiers (e.g., M1, M2, or S1, S2)
- Remaining columns: Numerical criteria values
- No missing values
- All values must be numeric
Weights
- Array of positive numbers
- Length must match number of criteria
- Should ideally sum to 1.0 (normalized weights)
- Higher weight = more important criterion
Impacts
- '+' for benefit criteria (higher is better)
- '-' for cost criteria (lower is better)
- Length must match number of criteria
Requirements
- Python 3.7+
- NumPy
- Pandas
Installation from Source
git clone <repository-url>
cd topsis-package
pip install -r requirements.txt
pip install -e .
Error Handling
Common Errors
AssertionError: Weights array should be of length X
- Check that number of weights matches number of criteria (excluding ID column)
AssertionError: Decision matrix a must be 2D
- Ensure CSV file has proper 2D structure with rows and columns
AssertionError: Could not recognize csv file
- Verify file has .csv extension
ValueError: Could not find numeric values
- Check that all criteria contain numeric values (no text values)
Contributing
Contributions are welcome! Please feel free to submit pull requests or open issues for bugs and feature requests.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file topsis_102303591-0.1.0.tar.gz.
File metadata
- Download URL: topsis_102303591-0.1.0.tar.gz
- Upload date:
- Size: 7.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fc2c862e73c2ccc1a1e4ff798cbd34b94eb121d838afccae1e19fd1f34c1ba62
|
|
| MD5 |
31d28fbe32417815963f8e5214b93fe0
|
|
| BLAKE2b-256 |
6e6e1d178445c711bfa5574f5b7066dfb1113f31a10a149ab0bedc95d71d3af1
|
File details
Details for the file topsis_102303591-0.1.0-py3-none-any.whl.
File metadata
- Download URL: topsis_102303591-0.1.0-py3-none-any.whl
- Upload date:
- Size: 7.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4a54369436d7a5a36e79781dd6a7ddd842007b85502654d56fb2c98d70b940ca
|
|
| MD5 |
55cfc1bc7f9e0e3bbf913d335a3ac58d
|
|
| BLAKE2b-256 |
745208eec6bd65100afe471f3e93fb95e507cd77dd438a4f32dd248a3c8b79fe
|