Compare commits

...

2 Commits

Author SHA1 Message Date
d85cfc5dc0 remove extra file 2023-11-16 22:21:36 +04:00
6c43c5a693 lab4 ready 2023-11-16 22:21:04 +04:00
15 changed files with 852320 additions and 0 deletions

View File

@ -0,0 +1,83 @@
# Лабораторная работа №4
> Кластеризация
### Как запустить лабораторную работу
1. Установить python, numpy, sklearn, matplotlib, plotly
2. Запустить команду `python tnse.py` в корне проекта
### Использованные технологии
* Язык программирования `python`
* Библиотеки `numpy, sklearn, matplotlib, plotly`
* Среда разработки `PyCharm`
### Что делает программа?
Цель программы: кластеризовать ценовые диапазоны автомобилей на вторичном рынке.
Используя метод кластеризации t-SNE, происходит обучение, оценка и вывод результатов кластеризации в виде графика.
Так как метод визуальный, то оценка будет проводится субъективно
по критериям общего цвета и отдалённости кластеров друг от друга.
#### Эксперимент
Текущие параметры:
- mileage
- year
- price
##### TSNE(learning_rate=100)
На размере данных в 1000 строк
![1 эксперимент на небольшом кол-ве данных](exp1_small.png)
На размере данных в 15000 строк
![1 эксперимент на большом кол-ве данных](exp1.png)
##### TSNE(learning_rate=200, perplexity=50, early_exaggeration=6)
early_exaggeration - определяет, насколько плотными будут естественные кластеры исходного пространстве
во вложенном пространстве и сколько места будет между ними. (12 по умолчанию)
На размере данных в 1000 строк
![2 эксперимент на небольшом кол-ве данных](exp2_small.png)
На размере данных в 15000 строк
![2 эксперимент на большом кол-ве данных](exp2.png)
##### TSNE(learning_rate=200, perplexity=50, early_exaggeration=6, angle=0.1)
angle - Используется только если метод='barnes_hut'
Это компромисс между скоростью и точностью в случае T-SNE с применением алгоритма Барнса-Хата. (0.5 по умолчанию)
На размере данных в 1000 строк
![3 эксперимент на небольшом кол-ве данных](exp3_small.png)
На размере данных в 15000 строк
![3 эксперимент на большом кол-ве данных](exp3.png)
**Выводы:**
Чем больше данных, тем лучше алгоритм выделяет кластеры.
Настроив параметры алгоритма удалось достичь улучшения результата,
но качество все равно можно считать неполностью удовлетворительным, так как кластеры выделяются с заметным уровнем шума.
Другие методы кластеризации справляются лучше, если провести дополнительный эксперимент,
то можно четко выделить ценовые диапазоны, например:
Ценовые диапазоны по пробегу
![дополнительный эксперимент 1](exp1_addi.png)
Ценовые диапазоны по году выпуска
![дополнительный эксперимент 2](exp2_addi.png)
В данных примерах можно особенно точно проследить зависимость между параметрами
#### Итоговые выводы
Алгоритм t-SNE визуальный и точность определяется восприятием графика. Поэтому использовать его лучше только в целях визуализации.
Для данной задачи алгоритм не подходит, так как решает её недостаточно качественно.

View File

@ -0,0 +1,3 @@
NUMBER_OF_CLUSTERS = 3
DATA_SIZE = 1000

View File

@ -0,0 +1,31 @@
import pandas as pd
from constants import DATA_SIZE
def load_data():
data = read_data()
Y = data['Model']
X = data[['Year', 'Price', 'Mileage']]
return X, Y
def fit_model(model, x):
transformed = model.fit_transform(x)
return transformed[:, 0], transformed[:, 1]
def create_data():
data = read_data()
return data[['Year', 'Price']]
def read_data():
data = pd.read_csv('true_car_listings.csv')[:DATA_SIZE]
unique_numbers = list(set(data['Model']))
data['Model'] = data['Model'].apply(unique_numbers.index)
return data

View File

@ -0,0 +1,72 @@
import numpy as np
from sklearn.manifold import TSNE
from matplotlib import pyplot as plt
from sklearn.cluster import AgglomerativeClustering
import plotly.express as px
from constants import *
from data import load_data, fit_model, create_data
def show_plots(y, x_axis, y_axis, plot_name):
only_labels = y.to_list()
labels = {
"x": "Price",
"y": "Value",
}
fig = px.scatter(None, x=x_axis, y=y_axis, labels=labels, opacity=1, color=only_labels)
fig.update_xaxes(showgrid=True, gridwidth=1, gridcolor='lightgrey',
zeroline=True, zerolinewidth=1, zerolinecolor='lightgrey',
showline=True, linewidth=1, linecolor='black')
fig.update_yaxes(showgrid=True, gridwidth=1, gridcolor='lightgrey',
zeroline=True, zerolinewidth=1, zerolinecolor='lightgrey',
showline=True, linewidth=1, linecolor='black')
fig.update_layout(title_text=plot_name, plot_bgcolor='white')
fig.update_traces(marker=dict(size=4))
fig.write_html(f'images/image.html')
def build_launch_name(filename: str, model: TSNE):
data = [
filename, ' t-SNE ',
'learning_rate=', str(model.learning_rate), ' ',
'perplexity=', str(model.perplexity), ' ',
'early_exaggeration=', str(model.early_exaggeration), ' ',
'n_iter=', str(model.n_iter), ' ',
'n_iter_without_progress=', str(model.n_iter_without_progress), ' ',
'min_grad_norm=', str(model.min_grad_norm), ' ',
'metric=', str(model.metric), ' ',
'init=', str(model.init), ' ',
'method=', str(model.method), ' ',
'angle=', str(model.angle),
]
return ''.join(data)
def launch(filename, X, Y, model: TSNE):
x_axis, y_axis = fit_model(model, X)
plot_name = build_launch_name(filename, model)
show_plots(Y, x_axis, y_axis, plot_name=plot_name)
def draw_experimental_clusters():
data = create_data()
cluster = AgglomerativeClustering(n_clusters=NUMBER_OF_CLUSTERS, affinity='euclidean', linkage='ward')
plt.xlabel("Год", fontweight="bold")
plt.ylabel("Цена", fontweight="bold")
corr = np.array(data)
cluster.fit_predict(corr)
plt.scatter(corr[:, 0], corr[:, 1], c=cluster.labels_, cmap='rainbow')
plt.show()
def tnse_cluster():
X, Y = load_data()
model = TSNE(n_components=2, learning_rate=200, perplexity=50, early_exaggeration=6, angle=0.1)
launch(filename='true_car_listings.csv', X=X, Y=Y, model=model)

Binary file not shown.

After

Width:  |  Height:  |  Size: 498 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 512 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 494 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

View File

@ -0,0 +1,4 @@
from drawing import draw_experimental_clusters
if __name__ == '__main__':
draw_experimental_clusters()

View File

@ -0,0 +1,4 @@
from drawing import tnse_cluster
if __name__ == '__main__':
tnse_cluster()

File diff suppressed because it is too large Load Diff