Alleen sorteren blijft een worsteling. Om de 'outliers' te kunnen 'verklaren' heb ik de procentuele afwijking van het gemiddelde, per meetwaarde berekend. Uiteraard wil ik de grootste percentages met de title van de meetwaardes 'vooraan' hebben. Ik plak ze daarom in 1 array en probeer ze op percentage te sorteren. Hij blijft raar doen. Eerst sorteert hij steevast op de titels in plaats van op de namen. Daarna sorteert hij oplopend de 'normale percentages, dan volgen de exponentiële percentages en het eindigt met de nullen!? Alleen dat laatste lijkt een beetje op wat ik wil. Ik probeer allerlei sorteer variaties maar zonder veel succes. Pas als ik de programma volgorde omdraai, eerst sorteren en dan pas op elkaar plakken lijkt het resultaat beter. Gelukkig is dat mogelijk in Pyhon en Numpy doordat met de functie 'argsort' een array van de indexen wordt gemaakt van de gesorteerde lijst. Met die array kan ik dus zowel de waardes als de titels netjes sorteren. Eindelijk. Vanuit een matrix met 10128 onderzoeken met 280 parameters krijg ik 102 'anomalie meldingen' Dat lijkt behapbaar. Nu naar de volgende stap: rapportage. Ik ben benieuwd!
>>> execfile('/Users/DWW/Documents/2 TTE_TEE outliers.py')
(10128, 280)
nu, gamma = 0.01 0.001 number outliers: 102 Het programma zover:
#execfile('/Users/DWW/Documents/2 TTE_TEE outliers.py')
import os
import numpy as np
XH = np.load('/Volumes/Slot 4 2tB/Ziekenhuis data/X.npy')
collist = np.load('/Volumes/Slot 4 2tB/Ziekenhuis data/collist.npy')
R, X = XH[:,:1], XH[:,1:] # split in reference (R) and parameter values (X)
print X.shape
# Data schoning : Vul lege waardes (nan) met het gemiddelde van de colom + schaal de waarden tussen 0 en 1.
from sklearn.preprocessing import Imputer
imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
imp.fit(X)
X = imp.transform(X)
from sklearn import preprocessing
min_max_scaler = preprocessing.MinMaxScaler()
X = min_max_scaler.fit_transform(X)
# En nu de daadwerkelijke 'anomaly detection'
xl, xb = X.shape
#parms = np.array(X, dtype=float)
av = np.average(X, axis = 0)
outliers = []
contrib = []
first = True
from sklearn import svm
# Testen verschillende waardes van SVM (support vector machine) parameters: nu and gamma for outlier detection.
for nu in [0.01 ]:
for gamma in [0.001]:
clf = svm.OneClassSVM(nu=nu, kernel="rbf", gamma=gamma)
clf.fit(X)
#print ('nu, gamma = ',nu,gamma)
c=0
for i in range(xl):
if clf.predict(X[i]) == -1:
c += 1
outliers = outliers + [R[i]] # list met SeriesInstanceUID
h = np.absolute(np.subtract(av, X[i])) # Calculate absolute difference between avarage and current value
h = 100 * h / np.sum(h) # Calculate relative percentage
s = np.argsort(h) # s = sortering index parameters
co = collist[1:] # co = collist minus de onderzoeks identificatie
h = np.vstack((co[s], h[s])) # Combine difference with columnlist sorted
h[:] = h[:,::-1] # Reverse list (large to small)
if first:
contrib = [R[i] , h]
first = False
else:
contrib = np.vstack((contrib, [R[i] , h]))
#print h #h[:,-10:]
#if c > 1:
# break
print 'nu, gamma = ',nu,gamma, 'number outliers: ',c # , i+1, X[i][0]
#print 'outliers = ', outliers
#print '# outliers = ', len(outliers)
#print 'contrib = ', contrib
np.save('/Volumes/Slot 4 2tB/Ziekenhuis data/outliers',outliers)
np.save('/Volumes/Slot 4 2tB/Ziekenhuis data/contrib',contrib)
Geen opmerkingen:
Een reactie posten