library(reticulate)
data_discrim={'y':[0,0,0,0,0,1,1,1,1,1],
'x1':[4,3,3,2,2,8,7,5,3,3],
'x2': [2,1,2,2,5,3,4,5,4,2]
}
import pandas as pd
df_discrim=pd.DataFrame(data_discrim)
df_discrim
## y x1 x2
## 0 0 4 2
## 1 0 3 1
## 2 0 3 2
## 3 0 2 2
## 4 0 2 5
## 5 1 8 3
## 6 1 7 4
## 7 1 5 5
## 8 1 3 4
## 9 1 3 2
import numpy as np
y = np.array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1])
X = np.array([[4, 2], [3, 1], [3, 2], [2, 2], [2, 5], [8, 3], [7, 4],
[5, 5], [3, 4], [3, 2]])
y
## array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1])
X
## array([[4, 2],
## [3, 1],
## [3, 2],
## [2, 2],
## [2, 5],
## [8, 3],
## [7, 4],
## [5, 5],
## [3, 4],
## [3, 2]])
#library(reticulate)
#py_install("scikit-learn")
#import numpy as np
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
lda= LinearDiscriminantAnalysis(n_components=1)
lda.fit(X,y)
## LinearDiscriminantAnalysis(n_components=1)
scores=lda.transform(X)
scores
## array([[-0.43107609],
## [-1.35954768],
## [-0.92847159],
## [-1.42586708],
## [-0.1326388 ],
## [ 1.98958197],
## [ 1.92326257],
## [ 1.35954768],
## [-0.0663194 ],
## [-0.92847159]])
print(lda.coef_)
## [[0.85106383 0.73758865]]
lda.scalings_
## array([[0.49739549],
## [0.43107609]])
lda.intercept_
## array([-5.61702128])
lda.predict([[4.1,2.2]])
## array([0])
pred=lda.predict(X)
pred
## array([0, 0, 0, 0, 0, 1, 1, 1, 0, 0])
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
print(confusion_matrix(pred, y))
## [[5 2]
## [0 3]]
Clasificación politómica
Demostramos un segundo análisis discriminante, esta vez en los datos de train. Primero nosotros configurar nuestro archivo de datos:
train = np.array([1, 1, 1, 2, 2, 2, 3, 3, 3])
X = np.array([[5, 2], [2, 1], [6, 3], [9, 7], [8, 9], [7, 8], [9, 8],
[10, 10], [10, 9]])
X
## array([[ 5, 2],
## [ 2, 1],
## [ 6, 3],
## [ 9, 7],
## [ 8, 9],
## [ 7, 8],
## [ 9, 8],
## [10, 10],
## [10, 9]])
model = lda.fit(X, train)
model
## LinearDiscriminantAnalysis(n_components=1)
Como tenemos tres grupos en la variable de respuesta, Python calculará dos funciones. Como antes, para obtener los coeficientes brutos (que, por cierto, concuerdan con Los coeficientes no estandarizados de SPSS si también realiza el análisis con ese software), calculamos:
print(model.scalings_)
## [[ 0.02983363 0.83151527]
## [ 0.9794679 -0.59019908]]
Como hicimos para el caso de dos grupos, podemos obtener las puntuaciones discriminantes para cada función (que también coincide con SPSS):
model.transform(X).shape
## (9, 1)
model.transform(X)
## array([[-4.31397269],
## [-5.38294147],
## [-3.30467116],
## [ 0.70270131],
## [ 2.63180348],
## [ 1.62250195],
## [ 1.68216921],
## [ 3.67093863],
## [ 2.69147074]])
pred = model.predict(X)
pred
## array([1, 1, 1, 2, 2, 2, 2, 3, 3])
print(confusion_matrix(pred, train))
## [[3 0 0]
## [0 3 1]
## [0 0 2]]
model.predict([[5.3,2]])
## array([1])