※この記事は2020年に作成しました
#概要
七対子エージェントと国士無双エージェントの手牌から打牌を予測するニューラルネットワークの中間層の出力の100次元のデータを集め、それを主成分分析した。
データ数は両方とも5000個ずつである。
#結果
##第一主成分と第二主成分の散布図
それぞれ色分けしてラベルを表示している。
意外と違いが出てることがわかる。
##累積寄与率
2つのデータがあるからか、データの8割を説明するのに約第30主成分まで必要。
##第一主成分と第二主成分における観測変数の寄与度をプロットする
100次元もあるからさすがにごちゃごちゃしてるし、学習させるごとに形や値は全然変わってくる。
#作成したプログラム
# coding: UTF-8
import numpy as np
import matplotlib.pyplot as plt
import sklearn #機械学習のライブラリ
from sklearn.decomposition import PCA #主成分分析器
from pandas import plotting
import matplotlib.ticker as ticker
import pandas as pd
from sklearn.preprocessing import StandardScaler
data = 5000
chitoi = np.loadtxt("C:/Users/p-user/Desktop/chitoi_pca.csv")
chitoi = np.delete(chitoi,slice(data,None),0)
kokushi = np.loadtxt("C:/Users/p-user/Desktop/kokushi_pca.csv")
kokushi = np.delete(kokushi,slice(data,None),0)
df = np.vstack((chitoi,kokushi))
#print(df.shape)
lavel = np.zeros((data*2))
for i in range(data,len(lavel)):
lavel[i] = 1
pca = PCA()
feature = pca.fit(df)
# データを主成分空間に写像
feature = pca.transform(df)
#主成分得点
pd.DataFrame(feature, columns=["PC{}".format(x + 1) for x in range(100)]).head()
"""
#累積寄与率をプロット
plt.gca().get_xaxis().set_major_locator(ticker.MaxNLocator(integer=True))
plt.plot([0] + list( np.cumsum(pca.explained_variance_ratio_)), "-o")
plt.xlabel("Number of principal components")
plt.ylabel("Cumulative contribution rate")
plt.grid()
plt.show()
"""
"""# 第一主成分と第二主成分における観測変数の寄与度をプロットする
plt.figure(figsize=(6, 6))
for x, y, name in zip(pca.components_[0], pca.components_[1], range(100)):
plt.text(x, y, name)
#print(x,y,name)
plt.scatter(pca.components_[0], pca.components_[1], alpha=0.8)
plt.grid()
plt.xlabel("PC1")
plt.ylabel("PC2")
plt.show()
"""
"""
plt.figure(figsize=(6, 6))
#plt.scatter(feature[:, 0], feature[:, 1], alpha=0.8, c=list(lavel), label=legend)
plt.scatter(feature[:4999, 0], feature[:4999, 1], alpha=0.8, c='red', label='Chitoitsu')
plt.scatter(feature[data:, 0], feature[data:, 1], alpha=0.8, c='blue', label='Kokushimuso')
plt.grid(True)
plt.xlabel("PC1")
plt.ylabel("PC2")
plt.legend(loc='upper left')
plt.show()
"""