Update k-prototypes algorithm

Add another random initialization, it can be further improved to become more stable. Add functions for calculating the intra-cluster error and between cluster error, as well as the calinski-harabasz clustering criterion. Now a wrapper can be written to automatically select the best number of clusters.