<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Lineare Diskriminanzanalyse
Araz, Hasenklever, Pede
Laden von Bibliotheken
Step1:  Laden der Merkmalsmatrix
und Vorverarbeitung von Zeilen und Spalten nach Anzahl von NaNs und stark korrelierenden Merkmalen
Step2:  Produktweise Sortierung der Daten
minimale Anzahl der Rohre je Walzlos festlegen, um die Schätzung je Walzlos zu verbessern,
und Daten nach Produkten sortieren
Step3:  Auswahl des Produtes durch Schieberegler implementieren
TODO Produkteigenschaften (LG, AD, WD) ausgeben
Step4:  Auswahl eines Produktes und Ausgabe der Anzahl von Walzlosen mit "genügend" Rohren
Step5:  Verbleibende Merkmale
Step6:  Aufteilen der Daten in Test- und Trainingsdaten
Step7:  Normalisierung der Daten
Step8:  Kovarianzmatrix von Trainings- und Testdaten
Step9:  Dürchführen der LDA auf die Trainingsdaten
Step10:  Darstellung der Eigenwerte
Step11:  Testen der Klassifikation
Step12:  Darstellung der transformierten Trainingsdaten und Klassenzugehörigkeit
Step13:  Interpretation der LDA-Ergebnisse
Die Helligkeit der Punkte bildet die Größe des Beitrags des Merkmals im jeweiligen Eigenvektor ab.
Step14:  Darstellung der Eigenvektoren
<ASSISTANT_TASK:>
Python Code:
%reload_ext autoreload
%autoreload 2
import numpy as np
import os
import pandas as pd
import random
import scipy
from scipy.stats import zscore
# interactive
from ipywidgets.widgets import interact, IntSlider, FloatSlider
from IPython.display import display
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
from multiDatenanalyse import *
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline
mmPfad = r"D:\C\Uni\Master\KSS\MV_Analyse\Messmatrix.csv"#'../data/Messmatrix.csv'
Explanation: Lineare Diskriminanzanalyse
Araz, Hasenklever, Pede
Laden von Bibliotheken
End of explanation
df = load_data(mmPfad)
Explanation: Laden der Merkmalsmatrix
und Vorverarbeitung von Zeilen und Spalten nach Anzahl von NaNs und stark korrelierenden Merkmalen
End of explanation
min_num_walzlos = 300
df_all_prod = [extract_product(df, product_id=product_id, min_num_walzlos=min_num_walzlos) for product_id in range(26)]
Explanation: Produktweise Sortierung der Daten
minimale Anzahl der Rohre je Walzlos festlegen, um die Schätzung je Walzlos zu verbessern,
und Daten nach Produkten sortieren
End of explanation
@interact(index=IntSlider(min=0, max=25, value = 11))
def count_per_product(index):
    print("Anzahl der Walzlose: "+str(len(pd.unique(df_all_prod[index]["Header_Walzlos"]))))
Explanation: Auswahl des Produtes durch Schieberegler implementieren
TODO Produkteigenschaften (LG, AD, WD) ausgeben
End of explanation
product_id = 11
df_prod = df_all_prod[product_id]
print("Anzahl der Walzlose: "+str(len(pd.unique(df_prod["Header_Walzlos"]))))
Explanation: Auswahl eines Produktes und Ausgabe der Anzahl von Walzlosen mit "genügend" Rohren
End of explanation
df_prod.columns
Explanation: Verbleibende Merkmale:
End of explanation
test_frac = 0.2
train_set, test_set = get_lda_data(df_prod, test_frac=test_frac)
Explanation: Aufteilen der Daten in Test- und Trainingsdaten
End of explanation
train_set['data'] = zscore(train_set['data'])
test_set['data'] = zscore(test_set['data'])
Explanation: Normalisierung der Daten
End of explanation
cov_train = np.cov(train_set['data'].T)
cov_test = np.cov(test_set['data'].T)
plt.figure(figsize=(15,10))
ax1 = plt.subplot(121)
ax1.imshow(255*(cov_train-np.max(cov_train))/(np.max(cov_train)-np.min(cov_train)), 'gray')
ax1.set_title('Kovarianz der Trainingsdaten')
ax1.set_xlabel('Merkmal')
ax1.set_ylabel('Merkmal')
ax2 = plt.subplot(122)
ax2.imshow(255*(cov_test-np.max(cov_test))/(np.max(cov_test)-np.min(cov_test)), 'gray')
ax2.set_title('Kovarianz der Testdaten')
ax2.set_xlabel('Merkmal')
ax2.set_ylabel('Merkmal')
print('Wie selbstähnlich sind die Test- und Trainingsdaten?')
Explanation: Kovarianzmatrix von Trainings- und Testdaten
End of explanation
# extract data and label
X_train, y_train = train_set['data'], train_set['label']
X_test, y_test = test_set['data'], test_set['label']
# number components for transform
n_components = 3
# LDA object
sklearn_LDA = LDA(n_components=n_components, solver='eigen')
# fit with train data
sklearn_LDA = sklearn_LDA.fit(X_train, y_train)
Explanation: Dürchführen der LDA auf die Trainingsdaten
End of explanation
plt.stem(sklearn_LDA.explained_variance_ratio_)
plt.xlabel('Index Eigenwert')
plt.ylabel('Beitrag zur Varianz')
plt.title("Varainzverteilung")
Explanation: Darstellung der Eigenwerte
End of explanation
train_pred = sklearn_LDA.predict(X_train)
print('{0:.2f}% Genauigkeit bei der Klassifikation der Trainingsdaten'.format(100*np.mean(train_pred == y_train)))
test_pred = sklearn_LDA.predict(X_test)
print('{0:.2f}% Genauigkeit bei der Klassifikation der Testdaten'.format(100*np.mean(test_pred == y_test)))
Explanation: Testen der Klassifikation
End of explanation
data = sklearn_LDA.transform(X_train)
plot_lda(data, y_train, 'Transformierte Trainingsdaten')
Explanation: Darstellung der transformierten Trainingsdaten und Klassenzugehörigkeit
End of explanation
eigvecs = sklearn_LDA.scalings_
plt.figure(figsize=(20,5))
plt.imshow(np.abs(eigvecs), 'gray')
#_ = plt.axis('off')
plt.title("Eigenvektoren")
print('Einflussreichstes Merkmal im ersten EV: {}'.format(df[df.columns[6:]].columns[np.argmax(np.abs(eigvecs[:, 0]))]))
print('Einflussreichstes Merkmal im zweiten EV: {}'.format(df[df.columns[6:]].columns[np.argmax(np.abs(eigvecs[:, 1]))]))
Explanation: Interpretation der LDA-Ergebnisse
Die Helligkeit der Punkte bildet die Größe des Beitrags des Merkmals im jeweiligen Eigenvektor ab.
End of explanation
plt.figure(figsize=(20,10))
for index in range(3):
    ax = plt.subplot(1,3,index+1)
    ax.stem(eigvecs[:, index])
    ax.set_title('Eigenvektor {}'.format(index))
    ax.set_xlabel('Merkmalsindex')
    ax.set_ylabel('Beitrag in Eigenvektor')
Explanation: Darstellung der Eigenvektoren
End of explanation
<END_TASK>