2017-03-10 2 views
1

Je suis en train de se tenir/norme certaines données:normalisation et de standardisation des données 2d

Les données se compose de deux lectures de température, l'un d'un capteur et l'autre d'un thermomètre à mercure.

Comme si:

SENSOR THERM 
32.69 31.25 
32.00 30.25 
31.94 30.50 
31.87 30.50 
31.44 29.50 
... 

Je veux créer un modèle de régression et d'être stand/normalisé pour que j'ai besoin des données

Ce que je fais actuellement est:

  1. trouver la moyenne des données de capteur
  2. trouver la moyenne des données de la température
  3. calculer l'écart type des données de capteurs
  4. calculer l'écart type des données Therm
  5. créer une nouvelle liste, et ajoutez les valeurs normalisées que

est ici où les choses se compliquent. Après la création de cette nouvelle liste, je souhaite normaliser les valeurs de 0 à 1, ce qui me permet d'obtenir les valeurs les plus basses et les plus élevées à partir des données normalisées (Capteur et Therm ensemble). Mais cela semble un peu étrange.

Voici le code à ce jour:

data = [[32.69, 31.25], 
     [32.00, 30.25], 
     [31.94, 30.50], 
     [31.87, 30.50], 
     [31.44, 29.50]] 

# take mean from data 
mean_x = sum(x for x,y in data)/len(data) 
mean_y = sum(y for x,y in data)/len(data) 

# compute standard deviation 
std_d_x = (sum((x-mean_x)**2 for x,y in data)/len(data))**(1/2.0) 
std_d_y = (sum((y-mean_y)**2 for x,y in data)/len(data))**(1/2.0) 


stand_data = [] 

# get standardized values 
for x, y in data: 
    stand_x = (x - mean_x)/std_d_x 
    stand_y = (y - mean_y)/std_d_y 

    stand_data.append((stand_x, stand_y)) 

# find min/max value from the whole data 
min_v = min(min([x,y]) for x, y in stand_data) 
max_v = max(max([x,y]) for x, y in stand_data) 


for i, (stand_x, stand_y) in enumerate(stand_data): 
    # normalize it 
    norm_x = (stand_x - min_v)/(max_v - min_v) 
    norm_y = (stand_y - min_v)/(max_v - min_v) 

    # display 

    raw = "%.2f, %.2f"%(data[i][0], data[i][1]) 
    stand = "%.2f, %.2f"%(stand_x, stand_y) 
    norm = "%.2f, %.2f"%(norm_x, norm_y) 
    print("{raw} -> {stand} -> {norm}".format(**locals())) 

Voici le résultat:

Input data -> standardized -> normalized 
32.69, 31.25 -> 1.74, 1.51 -> 1.00, 0.93 
32.00, 30.25 -> 0.03, -0.27 -> 0.49, 0.40 
31.94, 30.50 -> -0.12, 0.18 -> 0.44, 0.53 
31.87, 30.50 -> -0.29, 0.18 -> 0.39, 0.53 
31.44, 29.50 -> -1.36, -1.60 -> 0.07, 0.00 

Ma question est: Comment dois-je normaliser ces données? Dois-je prendre la moyenne/deviantion de l'ensemble des données (Capteur et Therm ensemble)? Ou devrais-je les prendre séparément? Et à propos de la normalisation, devrais-je les faire comme je le fais, ou le faire séparément (ce qui semble donner des valeurs bizarres)?

Répondre

0

La standardisation/normalisation est généralement effectuée séparément pour chaque attribut, comme vous le faites maintenant. Mais dans le but de régression, consulter

https://stats.stackexchange.com/questions/29781/when-conducting-multiple-regression-when-should-you-center-your-predictor-varia/111997#111997

Pour autant que je vois, il y a deux points,

  1. Vous pouvez choisir la méthode de normalisation/standardisation que vous souhaitez utiliser les données. Par exemple, vous pouvez utiliser min-max normalization ou z-score normalization.

formules, où A est un attribut dans vos données SET-

# Min-Max Normalization (Final values are in between 0 and 1) 
v_ = (v - min(A))/(max(A) - min(A)) 
# Z - Score Normalization (Final values have a mean of 0 and SD of 1) 
v_ = (v - mean(A))/(standard_deviation(A)) 
  1. Mettre en oeuvre il

La mise en œuvre dépend totalement du langage de programmation .Par exemple, dans R, vous pouvez utiliser un balayage de fonction pour le normaliser en une seule ligne

+0

Les choses sont, quand je normalise si je les fais séparément, la valeur min/max pour les données de capteur sera 0,1 et min La valeur/max de Therm Data sera également égale à 0,1, ce qui est «incorrect?» car ils ne sont pas mappés au même intervalle. Ex: S: 32.69 -> 1, T: 31.25 -> 1 et S: 31.44 -> 0, T: 29.50 -> 0 –

+0

Je ne pense pas que ce soit faux. Étant donné que les valeurs d'origine avaient une plage/étendue différente, elles vont correspondre à différentes valeurs normalisées. – pmuntima