Temat: Metoda k-średnich

Witam.
Potrzebuję przepisać metodę k-średnich, kod z Pythona na język R.
Niestety nie mam na to czasu, a potrzebuję to zrobić.
Czy jest ktoś w stanie się tego podjąć ?
Poniżej kod:

import pandas as pd
import pyodbc
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from matplotlib import pyplot as plt
from scipy.cluster.hierarchy import dendrogram
from scipy.cluster.hierarchy import linkage

db_credentials = {
"server": "nazwa_serwera",
"db": "database"
}

connection_string = f'Driver={{SQL Server}};Server={db_credentials["server"]};Database={db_credentials["db"]};Trusted_Connection=yes; '

conn = pyodbc.connect(
connection_string
)

cursor = conn.cursor()

cursor.execute("SELECT DISTINCT NUMER_TRASY FROM DANE WHERE NUMER_LINII = '523'")

services = []
times_from_start = []
distances = []
shorters = []
avg_times_between = []
days = []

for row in cursor:
services.append(row.NUMER_TRASY)
for service in services:
print(service)
cursor.execute(f"SELECT MAX(CZAS_1) FROM DANE WHERE NUMER_TRASY = '{service}' AND NUMER_LINII = '523'")
for cursor_row in cursor:
times_from_start.append(cursor_row[0])
print(cursor_row[0])

cursor.execute(f"SELECT AVG(ODLEGLOSC) FROM DANE WHERE NUMER_TRASY = '{service}' AND NUMER_LINII = '523'")
for cursor_row in cursor:
distances.append(cursor_row[0])
print(cursor_row[0])

cursor.execute(f"SELECT COUNT(WYBOR) FROM DANE WHERE NUMER_TRASY = '{service}' AND WYBOR = 0 AND NUMER_LINII = '523'")
for cursor_row in cursor:
shorters.append(cursor_row[0])
print(cursor_row[0])

cursor.execute(f"SELECT AVG(CZAS_2) FROM DANE where NUMER_TRASY = '{service}' AND NUMER_LINII = '523'")
for cursor_row in cursor:
avg_times_between.append(cursor_row[0])
print(cursor_row[0])

cursor.execute(f"SELECT DISTINCT DZIEN_TYGODNIA FROM DANE where NUMER_TRASY = '{service}' AND NUMER_LINII = '523'")
for cursor_row in cursor:
days.append(cursor_row[0])
print(cursor_row[0])

print("\n")
df = pd.DataFrame(services, columns=['service'])
df['time_from_start'] = times_from_start
df['distance'] = distances
df['short'] = shorters
df['avg_time_between'] = avg_times_between
df['day'] = days

df = df.sort_values(by=['time_from_start'])
df = df.reset_index(drop=True)

# Wykorzystanie algorytmu PCA Algorytm wyznaczania głównych składowych (PCA) wykorzystany zostaje w celu ograniczenia
# danych do dwóch wymiarów i ich zwizualizowania.

X = df.iloc[:, 1:5].values

pca = PCA(n_components=2)

X_pca = pca.fit_transform(X)

plt.scatter(X_pca[:, 0], X_pca[:, 1])
plt.xlabel('Główna składowa 1')
plt.ylabel('Główna składowa 2')
plt.title('Dane potraktowane algorytmem PCA')
plt.show()

df_pca = pd.DataFrame(X_pca)
above_20 = df_pca[df_pca[0] > 20]
print(above_20)

var = df.iloc[0:1, :]

df_no_outliers = df[df["service"] != 'TX-DWZ/DP/09.49__']

# Algorytm PCA zostaje ponownie wykorzystanu (po usunięciu wartości odstającej)

X_no_outliers = df_no_outliers.iloc[:, 1:5]

pca = PCA(n_components=2)

X_pca_no_outliers = pca.fit_transform(X_no_outliers)

plt.scatter(X_pca_no_outliers[:, 0], X_pca_no_outliers[:, 1])
plt.xlabel('Główna składowa 1')
plt.ylabel('Główna składowa 2')
plt.title('Dane potraktowane algorytmem PCA ( z usuniętą wartością odstającą)')
plt.show()

# Wyznaczenie liczby klastrów z wykorzystaniem metody łokcia (algorytm k-średnich)

distortions = []
for i in range(1, 11):
km = KMeans(n_clusters=i,
init='random',
n_init=10,
max_iter=300,
random_state=0)
km.fit(X_pca_no_outliers)
distortions.append(km.inertia_)
plt.plot(range(1, 11), distortions, marker='o')
plt.xlabel('Liczba klastrów')
plt.ylabel('Zniekształcenie')
plt.title('Metoda łokcia')
plt.show()

# Podział na 3 klastry

km3 = KMeans(n_clusters=3,
init='random',
n_init=10,
max_iter=500,
random_state=0)
y_km3 = km3.fit_predict(X_pca_no_outliers)

plt.scatter(X_pca_no_outliers[y_km3 == 0, 0],
X_pca_no_outliers[y_km3 == 0, 1],
s=50, c='lightgreen',
marker='o', edgecolor='black',
label='Skupienie 1.')
plt.scatter(X_pca_no_outliers[y_km3 == 1, 0],
X_pca_no_outliers[y_km3 == 1, 1],
s=50, c='orange',
marker='v', edgecolor='black',
label='Skupienie 2.')
plt.scatter(X_pca_no_outliers[y_km3 == 2, 0],
X_pca_no_outliers[y_km3 == 2, 1],
s=50, c='lightblue',
marker='^', edgecolor='black',
label='Skupienie 3.')
plt.scatter(km3.cluster_centers_[:, 0],
km3.cluster_centers_[:, 1],
s=250, marker='*',
c='red', edgecolor='black',
label='Centroidy')
plt.title("Podział na 3 klastry")
plt.grid()
plt.show()

# Podział na 6 klastrów

km6 = KMeans(n_clusters=6,
init='random',
n_init=10,
max_iter=500,
random_state=0)
y_km6 = km6.fit_predict(X_pca_no_outliers)

plt.scatter(X_pca_no_outliers[y_km6 == 0, 0],
X_pca_no_outliers[y_km6 == 0, 1],
s=50, c='lightgreen',
marker='o', edgecolor='black',
label='Skupienie 1.')
plt.scatter(X_pca_no_outliers[y_km6 == 1, 0],
X_pca_no_outliers[y_km6 == 1, 1],
s=50, c='orange',
marker='v', edgecolor='black',
label='Skupienie 2.')
plt.scatter(X_pca_no_outliers[y_km6 == 2, 0],
X_pca_no_outliers[y_km6 == 2, 1],
s=50, c='lightblue',
marker='^', edgecolor='black',
label='Skupienie 3.')
plt.scatter(X_pca_no_outliers[y_km6 == 3, 0],
X_pca_no_outliers[y_km6 == 3, 1],
s=50, c='red',
marker='<', edgecolor='black',
label='Skupienie 4.')
plt.scatter(X_pca_no_outliers[y_km6 == 4, 0],
X_pca_no_outliers[y_km6 == 4, 1],
s=50, c='blue',
marker='>', edgecolor='black',
label='Skupienie 5.')
plt.scatter(X_pca_no_outliers[y_km6 == 5, 0],
X_pca_no_outliers[y_km6 == 5, 1],
s=50, c='green',
marker='s', edgecolor='black',
label='Skupienie 6.')
plt.scatter(km6.cluster_centers_[:, 0],
km6.cluster_centers_[:, 1],
s=250, marker='*',
c='red', edgecolor='black',
label='Centroidy')
plt.title("Podział na 6 klastrów")
plt.grid()
plt.show()

# Wykorzystanie algorytmu grupowania hierarchicznego

df_matrix = df.iloc[:, 1:5]

X_matrix = df.iloc[:, 1:5].values

sc_pca = StandardScaler()

X_std = sc_pca.fit_transform(X)

df_std_matrix = pd.DataFrame(X_std)

row_clusters = linkage(df_std_matrix.values, method='complete', metric='euclidean')
K1 = pd.DataFrame(row_clusters,
columns=['Etykieta rzędu 1', 'Etykieta rzędu 2',
'Odległość', 'Liczba elementów klastra'],
index=['Klaster %d.' % (i + 1)
for i in range(row_clusters.shape[0])])

row_dendr = dendrogram(row_clusters)
plt.ylabel('Odległość')
plt.show()


Algorytm grupowania hierarchicznego nie jest potrzebny.
Pozdrawiam.