-
Notifications
You must be signed in to change notification settings - Fork 0
/
2_b_Clustering_the_users.py
59 lines (50 loc) · 2.15 KB
/
2_b_Clustering_the_users.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import pandas as pd
import os
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np
def load_csv(csv_name):
curdir = os.path.dirname(__file__)
csv_file = curdir+"/datasets/"+csv_name
csv = pd.read_csv(csv_file)
return csv
def plot_graphs(n,inertias):
dx = np.diff(n)
dy = np.diff(inertias)
slopes = dy/dx
plt.figure()
plt.plot(n,inertias)
plt.grid()
plt.title("Inertia")
plt.figure()
plt.plot(slopes)
plt.title("Slope")
plt.grid()
plt.show()
if __name__=="__main__":
ratings = load_csv("averageRatings.csv")
#ratings.info()
#υπαρχουν μονο 14 ταινιες χωρίς να αναγράφεται το είδος τους
#οπότε μια καλή προσέγγιση είναι να διαγραφεί αυτή η στήλη
ratings.drop('(no genres listed)',axis='columns', inplace=True)
#Συμπληρώνεται η κάθε κενή τιμη με τον μέσο όρο της στήλης στην οποία βρίσκεται
ratings.fillna(ratings.mean(),inplace=True)
idCol = ratings["UserId"]
ratings.drop("UserId",axis="columns",inplace =True)
#KMEANS για 30 διαφορετικούς αριθμούς cluster
inertias = []
for i in range(1,30):
model = KMeans(n_clusters = i)
model.fit(ratings)
inertias.append(model.inertia_)
n = [x for x in range(1,i+1)]
plot_graphs(n,inertias)
#Απο τα διαγραμματα βλεπω ότι η αδράνεια μειώνεται εκθετικά με τον αριθμό τον clusters
#Ψάχνω την τιμή εκείνη που η κλίση της καμπύλης σταματάει να αλλάζει πολύ
#καθώς παραπάνω clusters από αυτή την τιμή δεν θα μου δώσουν επιπλέον πληφορορία
#επιλέγω αριθμό clusters = 10
model = KMeans(n_clusters = 10).fit(ratings)
clusters = pd.DataFrame()
clusters["userId"] = idCol
clusters["cluster"] = model.labels_
clusters.to_csv("datasets/clusters.csv",index=False)