<jupyter_start><jupyter_text>result1 の構造* 12  と　34 を合わせて グループ151 を作った (要素数2)* 101 と 142 を合わせて グループ152 を作った (要素数2)* ...* 41  と　グループ291 を合わせて グループ296 を作った (要素数50)* グループ294  と　グループ295 を合わせて グループ297 を作った (要素数100)* グループ296  と　グループ297 を合わせて グループ298 を作った (要素数150)<jupyter_code>print(len(df))
pd.DataFrame(result1)<jupyter_output>150<jupyter_text>結果の Dedrogram から、3グループを作る<jupyter_code>clusters = fcluster(result1, t=3, criterion='maxclust')

df_result = pd.concat([pd.DataFrame(clusters, columns = ["cluster"]), df], axis=1)
df_result<jupyter_output><empty_output><jupyter_text>* 結構うまく行っとる    * グループ1 setosa  (50件中、件誤検知なし、取りこぼしなし)    * グループ3 versicolor (50件中、2件誤検知、6件取りこぼし)    * グループ2 virginica (50件中、6件誤検知、2件取りこぼし)* Heatmap で、きちんと分類できているかを見る場合は、小さな値がはっきりわかるように log10 を取ったほうがいい。最大値が 1000 で 10 とか 20 とかが変なところに出ていないか見たい場合、log を取らないと白になってしまう。<jupyter_code>matrix = list()
for n in set(df_result['species']):
    ary = list()
    for c in set(df_result['cluster']):
        query = 'species == "' + n + '" & cluster == ' + str(c)
        size = len (df_result.query(query))
        ary.append(len (df_result.query(query)))
    
    matrix.append(ary)

df_heat = pd.DataFrame(matrix, index=set(df_result['species']), columns=set(df_result['cluster']))
df_heat
plt.figure(figsize=(9,6))
plt.title('分類グループごとのデータ数 (log10)', fontsize=20)
sns.heatmap(df_heat.applymap(lambda x : math.log10(x) if x > 0 else -1), cmap='Blues')<jupyter_output><empty_output><jupyter_text>結果の Dedrogram から、距離のしきい値 0.01 でグループ分けする<jupyter_code>clusters2 = fcluster(result1, 0.01, criterion='distance')

df_result2 = pd.concat([pd.DataFrame(clusters2, columns = ["cluster"]), df], axis=1)
df_result2<jupyter_output><empty_output><jupyter_text>7グループに別れた<jupyter_code>matrix = list()
for n in set(df_result2['species']):
    ary = list()
    for c in set(df_result2['cluster']):
        query = 'species == "' + n + '" & cluster == ' + str(c)
        ary.append(len (df_result2.query(query)))
    
    matrix.append(ary)

df_heat2 = pd.DataFrame(matrix, index=set(df_result2['species']), columns=set(df_result2['cluster']))
df_heat2
plt.figure(figsize=(9,6))
plt.title('分類グループごとのデータ数 (log10)', fontsize=20)
sns.heatmap(df_heat2.applymap(lambda x : math.log10(x) if x > 0 else -1), cmap='Blues')<jupyter_output><empty_output><jupyter_text>[参考] 応用例* Iris では、花全体の大きさの中での額や弁の大きさの割合で分類していたが、一般的にはパラメータごとに重み付けをして分類する* (Iris ではうまく行かないが) コード例としてやってみる<jupyter_code>data = df.iloc[:, 0:4]

# 平均
mean = data.mean()
print("MEAN:\n", mean)

# 分散
std = data.std()
print("\nSTD DIVISION:\n" , std)

# それぞれのパラメータを縦に並べたときの標準化スコアに、重み付けをつける
# 額の長さの重要度は、1000点
d0 = 1000 * (df.iloc[:, 0] - mean.iloc[0]) / std.iloc[0]
# 額の幅　の重要度は、1000点
d1 = 100 * (df.iloc[:, 1] - mean.iloc[1]) / std.iloc[1]
# 弁の長さの重要度は、10点
d2 = 10 * (df.iloc[:, 2] - mean.iloc[2]) / std.iloc[2]
# 弁の幅　の重要度は、1点
d3 = (df.iloc[:, 3] - mean.iloc[3]) / std.iloc[3]

# 重み付けしたパラメータを結合する
d = pd.concat([d0,d1,d2,d3], axis=1)

print(d)

result2 = linkage(d, metric = 'correlation', method = 'average')
plt.figure(figsize=(8, 8))
dendrogram(result2, orientation='right', labels=list(df.index), color_threshold=0.01)
plt.title("Dedrogram")
plt.xlabel("Threshold")
plt.grid()
plt.show()
clusters3 = fcluster(result2, 0.01, criterion='distance')

df_result3 = pd.concat([pd.DataFrame(clusters3, columns = ["cluster"]), df], axis=1)

matrix = list()
for n in set(df_result3['species']):
    ary = list()
    for c in set(df_result3['cluster']):
        query = 'species == "' + n + '" & cluster == ' + str(c)
        ary.append(len (df_result3.query(query)))
    
    matrix.append(ary)

df_heat3 = pd.DataFrame(matrix, index=set(df_result3['species']), columns=set(df_result3['cluster']))
df_heat3<jupyter_output><empty_output><jupyter_text>この場合は、実質的には、額の長さ = 花の大きさ　で分類することになっている。setosa と、[versicolor+virginica] の分類は出来るようだ。<jupyter_code>plt.figure(figsize=(9,6))
plt.title('分類グループごとのデータ数 (log10)', fontsize=20)
sns.heatmap(df_heat3.applymap(lambda x : math.log10(x) if x > 0 else -1), cmap='Blues')<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.16965174129353233, 'fraction_numerical': 0.05, 'mean_word_length': 5.861774744027303, 'pattern_counts': {'":': 0, '<': 28, '<?xml version=': 0, '>': 31, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '7', 'dir': 'jupyter-structured-clean-dedup', 'id': '179422', 'license': 'MIT', 'n_tokens_mistral': 2167, 'n_tokens_neox': 2022, 'n_words': 283, 'path': 'notes/Cluster.ipynb', 'repo_name': 'kagyuu/PandasExam', 'size': '4020'}