Nouvelle police | Ancienne police | |
---|---|---|
La source | ①U+658E (542,000 personnes) <fontcolor=red>Lasource |
②U+9F4B(86,800personnes) Lasource(①)Ancienne police |
En réalité, L'écritureerreur |
③U+6589(323,000 personnes) Lasource(①)のL'écritureerreur |
④U+9F4A(37,300personnes) Anciennepolice(②)のL'écritureerreur |
Après tout, je veux que ** "Sai" ** ((1) source) soit ** représentatif (au milieu) ** de tous les caractères Sai (4 types).
from umap import UMAP
# Umap decomposition
decomp = UMAP(n_components=2,random_state=42)
# fit_transform umap(Données de caractères Saito 4)
embedding4 = decomp.fit_transform(all.T[[1,12,31,32]])
from sklearn.cluster import KMeans
#clustering (1 cluster)
clustering = KMeans(n_clusters=1,random_state=42,)
# fit_predict cluster
cl_y = clustering.fit_predict(embedding4)
# visualize (La mise en œuvre sera décrite plus tard)
showScatter(
embeddings = embedding4,
clusterlabels = cl_y,
centers = clustering.cluster_centers_,
imgs = all.T[[1,12,31,32]].reshape(-1,h,w)
)
Par ordre de proximité du centre de gravité | lettre | Distance du centre de gravité | Note |
---|---|---|---|
1ère place | 0.6281 | ②Source(anciennepolice) | |
2ème place | 0.6889 | ③Erreur(nouvellepolice) | |
3ème place | 0.7339 | ①Source(nouvellepolice) | |
4e place | 0.8743 | ④Erreur(anciennepolice) |
from umap import UMAP
# Umap decomposition
decomp = UMAP(n_components=2,random_state=42)
# fit_transform umap(Toutes les données de 33 caractères)
embeddings = decomp.fit_transform(all.T)
from sklearn.cluster import KMeans
# clustering(Nombre de clusters: 1)
clustering = KMeans(n_clusters=1, random_state=42)
# fit_predict cluster
cl_y = clustering.fit_predict(embeddings)
# visualize
showScatter(embeddings, cl_y, clustering.cluster_centers_)
Par ordre de proximité du centre de gravité | lettre | Distance du centre de gravité | Note |
---|---|---|---|
1ère place | 0.494 | ||
2ème place | 0.787 | ||
3ème place | 1.013 | ||
4e place | 1.014 |
from sklearn.cluster import KMeans
# clustering(Nombre de clusters: 4)
clustering = KMeans(n_clusters=4, random_state=42)
# fit_predict cluster
cl_y = clustering.fit_predict(embeddings)
# visualize
showScatter(embeddings, cl_y, clustering.cluster_centers_)
No | grappe | Centre de gravité | Autres personnages inclus |
---|---|---|---|
1 | rouge | ||
2 | Orange | ||
3 | Bleu | ||
4 | vert |
from sklearn.cluster import KMeans
# clustering(Nombre de clusters: 8)
clustering = KMeans(n_clusters=8, random_state=42)
# fit_predict cluster
cl_y = clustering.fit_predict(embeddings)
# visualize
showScatter(embeddings, cl_y, clustering.cluster_centers_)
No | grappe | grappeに含まれる字 |
---|---|---|
1 | pêche | |
2 | rouge | |
3 | thé | |
4 | Cendre | |
5 | Orange | |
6 | Bleu | |
7 | violet | |
8 | vert |
Elbow Chart
from yellowbrick.cluster import KElbowVisualizer
vis = KElbowVisualizer(
KMeans(random_state=42),
k=(1,34) #Nombre de clusters (plage sur l'axe horizontal))
)
vis.fit(embeddings)
vis.show()
from yellowbrick.cluster import KElbowVisualizer
vis = KElbowVisualizer(
KMeans(random_state=42),
k=(4,19) #Nombre de clusters (plage sur l'axe horizontal))
)
vis.fit(embeddings)
vis.show()
Silhouette Chart
from yellowbrick.cluster import silhouette_visualizer
fig = plt.figure(figsize=(15,25))
#Dessinez ensemble de 4 à 9 grappes
for i in range(4,10):
ax = fig.add_subplot(4,2,i-1)
silhouette_visualizer(KMeans(i),embeddings)
dendrogram
from scipy.cluster.hierarchy import linkage, dendrogram
Z = linkage(
y = embeddings,
method = 'weighted',
metric = "euclidean",
)
R = dendrogram(
Z=Z,
color_threshold=1.2, #Ajuster le nombre de clusters avec ce seuil
show_contracted=False,
)
Nombre de clusters | Dendrogramme | commentaire |
---|---|---|
4 | rougeJuste un peu cher | |
5 | La hauteur est uniforme violetJe m'inquiète pour quelques-uns Ça fait du bien |
|
8 | La hauteur et le nombre sont les mêmes, Est-il divisé trop finement? |
from sklearn.cluster import KMeans
# clustering(Nombre de clusters: 5)
clustering = KMeans(n_clusters=5, random_state=42)
# fit_predict cluster
cl_y = clustering.fit_predict(embeddings)
# visualize
showScatter(embeddings, cl_y, clustering.cluster_centers_)
No | grappe | Centre de gravité | Autres personnages inclus |
---|---|---|---|
1 | Bleu | ||
2 | violet | ||
3 | vert | ||
4 | rouge | ||
5 | Orange |
No | Comment choisir | Représentant Saito |
---|---|---|
1 | À partir de 4 kanji reconnus 1 caractèreSi vous choisissez, le représentant est |
|
2 | De tous les 33 kanji 1 caractèreSi tu choisis |
|
3 | De tous les 33 kanji 4 caractèresSi tu choisis |
|
4 | De tous les 33 kanji 8 caractèresSi tu choisis |
|
5 | Tous les 33 kanji Combien de clustersDoit être divisé en |
Environ 5 clustersCela semble bon |
6 | De tous les 33 kanji 5 caractèresSi tu choisis |
%matplotlib inline
%config InlineBackend.figure_format = 'retina'
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.lines as mlines
from matplotlib import offsetbox
from sklearn.preprocessing import MinMaxScaler
from PIL import Image
import matplotlib.patches as patches
rc = {
'font.family': ['sans-serif'],
'font.sans-serif': ['Open Sans', 'Arial Unicode MS'],
'font.size': 12,
'figure.figsize': (8, 6),
'grid.linewidth': 0.5,
'legend.fontsize': 10,
'legend.frameon': True,
'legend.framealpha': 0.6,
'legend.handletextpad': 0.2,
'lines.linewidth': 1,
'axes.facecolor': '#fafafa',
'axes.labelsize': 10,
'axes.titlesize': 14,
'axes.linewidth': 0.5,
'xtick.labelsize': 10,
'xtick.minor.visible': True,
'ytick.labelsize': 10,
'figure.titlesize': 14
}
sns.set('notebook', 'whitegrid', rc=rc)
def colorize(d, color, alpha=1.0):
rgb = np.dstack((d,d,d)) * color
return np.dstack((rgb, d * alpha)).astype(np.uint8)
colors = sns.color_palette('tab10')
def showScatter(
embeddings,
clusterlabels,
centers = [],
imgs = all.T.reshape(-1,h,w),
):
fig, ax = plt.subplots(figsize=(15,15))
#Mise à l'échelle avant de dessiner un diagramme de dispersion
scaler = MinMaxScaler()
embeddings = scaler.fit_transform(embeddings)
source = zip(embeddings, imgs ,clusterlabels)
#Dessinez des kanji sur un diagramme de dispersion
cnt = 0
for pos, d , i in source:
cnt = cnt + 1
img = colorize(d, colors[i], 0.5)
ab = offsetbox.AnnotationBbox(offsetbox.OffsetImage(img),0.03 + pos * 0.94,frameon=False)
ax.add_artist(ab)
#Dessinez des cercles concentriques à partir du centre de gravité
if len(centers) != 0:
for c in scaler.transform(centers):
for r in np.arange(3,0,-1)*0.05:
circle = patches.Circle(
xy=(c[0], c[1]),
radius=r,
fc='#FFFFFF',
ec='black'
)
circle.set_alpha(0.3)
ax.add_patch(circle)
ax.scatter(c[0],c[1],s=300,marker="X")
#Plage de dessin de l'axe
limit = [-0.1,1.1]
plt.xlim(limit)
plt.ylim(limit)
plt.show()
Recommended Posts