-
Notifications
You must be signed in to change notification settings - Fork 0
/
dyn_classifier.py
116 lines (83 loc) · 2.94 KB
/
dyn_classifier.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import numpy as np
from matplotlib import pyplot as plt
from astropy.table import Table
def dyn_classifier(Vc, verbose = True):
# Load dynamical classifier from 238 CALIFA galaxies
# from Kalinova et al. 2017b
dynclass = np.load('./data_input/dyn_classes.npz')
# ... dynamical radius
rads = dynclass['rads']
# ... eigenvectors
us = dynclass['eigenvectors']
ls = dynclass['eigenvalues']
# ... mean Vc
MeanVal = dynclass['Vc']
# ... prototype curves
cvc_SR = dynclass['cvc_SR'] - MeanVal
cvc_FL = dynclass['cvc_FL'] - MeanVal
cvc_RP = dynclass['cvc_RP'] - MeanVal
cvc_SP = dynclass['cvc_SP'] - MeanVal
pcvcs = np.zeros([4,len(cvc_SP)], dtype=np.float64)
pcvcs[0,:] = cvc_SR
pcvcs[1,:] = cvc_FL
pcvcs[2,:] = cvc_RP
pcvcs[3,:] = cvc_SP
cols = ['k','b','g','r']
centroids = np.zeros([4,2])
# Decompose prototypes on the PC base
for i in [0,1,2,3]:
centroids[i,0]=np.sum(pcvcs[i,:]*us[0,:])/np.sqrt(ls[0])
centroids[i,1]=np.sum(pcvcs[i,:]*us[1,:])/np.sqrt(ls[1])
# Load user CVC
Vc = Vc - MeanVal
pc1 = np.sum(Vc*us[0,:])/np.sqrt(ls[0])
pc2 = np.sum(Vc*us[1,:])/np.sqrt(ls[1])
pcs = np.array([pc1,pc2])
# Measure the distance to the centroids
dists = np.zeros(4)
for i in [0,1,2,3]:
dists[i] = np.linalg.norm(pcs-centroids[i,:])
mdist = np.argmin(dists)
percs = 100-dists/np.sum(dists)*100
percs = percs.astype(np.int)
tags = np.array(['SR', 'FL', 'RP', 'SP'])
names = np.array(['slow rising', 'flat', 'round peaked', 'sharp peaked'])
for i in np.argsort(percs):
tag = tags[i]
name = names[i]
if verbose:
print "Your CVC is "+str(percs[i])+"% closer to "+tag
if verbose:
print "Your CVC is "+names[mdist]+" ("+tags[mdist]+")!"
ucol = cols[mdist]
res = tags[mdist]
# Plot the result
if verbose:
fig = plt.figure(figsize=(14,7))
ax1 = fig.add_subplot(121)
ax2 = fig.add_subplot(122)
# Decompose prototypes on the PC base
for i in [0,1,2,3]:
ax1.plot(rads, pcvcs[i,:]+MeanVal, color = cols[i], lw = 3, ls='-')
ax2.scatter([centroids[i][0]],[centroids[i][1]],c = cols[i], marker = '*', s = 500, edgecolor = 'face')
ax1.plot(rads, Vc+MeanVal, color = ucol, lw = 2, ls='--', label = 'User CVC')
ax1.legend(numpoints = 1, loc = 4)
ax2.scatter([pc1],[pc2],c = 'w', marker = 'o', s = 250, edgecolor = ucol, lw = 2, label = 'User CVC')
ax2.legend(numpoints = 1, loc = 4)
ax1.set_xlabel('Radius/Reff')
ax1.set_ylabel('Vc [km/s]')
ax2.set_xlabel('PC1')
ax2.set_ylabel('PC2')
ax2.plot([-1.8,3.],[0.,0.],ls='--',color='k')
ax2.plot([0.,0.],[-5.,2.],ls='--',color='k')
ax2.set_xlim([-1.8,3.])
ax2.set_ylim([-5.,2.])
return res
#%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%
def tutorial():
data = Table.read('./data_input/example.txt',format='ascii')
Vcirc = data['Vcirc/[km/s]'].data
dclass = dyn_classifier(Vcirc,verbose=True)
#%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%
if __name__ == '__main__':
tutorial()