| CutiePie (QtPy) (version 5.13-000) | ||
|---|---|---|
| Prev | ||
To simplify the implementation of specific ML algorithms or fitting functions, CutiePie implements a factory for handling models and offers simple skeletons to fill in. Below a look at the skeleton for ML and fitting with examples of the implementation for K-Mean and Gaussian fit.
Example 9-1. ML algorithm skeleton.
import io
import sys, os
sys.path.append(os.getcwd())
import algo_factory
# Skeleton algo parameters
# param_1 = 5
# param_2 = 'test',
# param_3 = 100
class SkelAlgo:
def __init__(self, param_1, param_2, param_3):
self.param_1 = param_1
self.param_2 = param_2
self.param_3 = param_3
# implementation of the algorithm, the argument are mandatory even if not used
def start(self, data, weigths, nclusters, axis, figure=None):
print("Skeleton example. Implementation is all yours.")
class SkelAlgoBuilder:
def __init__(self):
self._instance = None
def __call__(self, param_1 = 5, param_2 = 'test', param_3 = 100, **_ignored):
if not self._instance:
self._instance = SkelAlgo(param_1, param_2, param_3)
return self._instance
Example 9-2. Example of ML algorithm based on the skeleton. The output is shown in Figure 3-5.
...
def start(self, data, weigths, nclusters, axis, figure=None):
# create kmeans object
kmeans = KMeans(nclusters, self.init, self.n_init, self.max_iter, self.tol, self.precompute_distances, self.verbose, self.random_state, self.algorithm)
# fit kmeans object to data
kmeans.fit(data, sample_weight=weigths)
cluster_center = kmeans.cluster_centers_
confidPerc = self.soft_clustering_weights(data,cluster_center)
prob_dict = {}
for i in range(len(confidPerc[0])):
prob_dict[i] = self.extract(confidPerc, i)
# CL 90%/CL 95%
bool_dict_90 = {}
bool_dict_95 = {}
w_90 = {}
w_95 = {}
sum90 = 0
sum95 = 0
for i in range(len(cluster_center)):
self.addPoint(axis, [cluster_center[i][0], cluster_center[i][1]])
bool_dict_90[i] = [True if x>0.9 else False for i, x in enumerate(prob_dict[i])]
bool_dict_95[i] = [True if x>0.95 else False for i, x in enumerate(prob_dict[i])]
w_90[i] = list(compress(weigths, bool_dict_90[i]))
w_95[i] = list(compress(weigths, bool_dict_95[i]))
sum90 += sum(w_90[i])
sum95 += sum(w_95[i])
print("#########################################")
print("# Results of K-Mean clustering analysis #")
print("#########################################")
for i in range(len(cluster_center)):
print("Cluster", i," with center (x,y)=(",cluster_center[i][0],",",cluster_center[i][1],")")
print("Confidence Level 90% -->", sum90/sum(weigths),"%")
print("Confidence Level 95% -->", sum95/sum(weigths),"%")
print("#########################################")
...
Example 9-3. Fitting function skeleton.
import io
import sys, os
sys.path.append(os.getcwd())
import pandas as pd
import numpy as np
import fit_factory
# Skeleton fit parameters
# param_1 = 1
# param_2 = 1,
# param_3 = 10
class SkelFit:
def __init__(self, param_1, param_2, param_3):
self.param_1 = param_1
self.param_2 = param_2
self.param_3 = param_3
# implementation of the algorithm, the argument are mandatory even if not used
def start(self, x, y, xmin, xmax, axis, fit_results):
print("Skeleton example. Implementation is all yours.")
class SkelFitBuilder:
def __init__(self):
self._instance = None
def __call__(self, param_1 = 1, param_2 = 2, param_3 = 10, **_ignored):
if not self._instance:
self._instance = SkelFit(param_1, param_2, param_3)
return self._instance
Example 9-4. Example of fitting function based on the skeleton.
...
# function defined by the user
def gauss(self, x, amplitude, mean, standard_deviation):
return amplitude*np.exp(-(x-mean)**2.0 / (2*standard_deviation**2))
# implementation of the fitting algorithm
def start(self, x, y, xmin, xmax, axis, fit_results):
fitln =None
amplitude = 2000
mean = xmin+(xmax-xmin)/2
standard_deviation = mean/10
p_init = [amplitude, mean, standard_deviation]
print(p_init)
popt, pcov = curve_fit(self.gauss, x, y, p0=p_init, maxfev=5000)
# plotting fit curve and printing results
try:
x_fit = np.linspace(x[0],x[-1], 10000)
y_fit = self.gauss(x_fit, *popt)
fitln, = axis.plot(x_fit,y_fit, 'r-')
for i in range(len(popt)):
s = 'Par['+str(i)+']: '+str(round(popt[i],3))+'+/-'+str(round(pcov[i][i],3))
fit_results.append(s)
except:
pass
return fitln
...