code: def new_orthogonal_center(X,data_norms,centroids,center_norms=None): 
      
      if center_norms is None:
          center_norms = np.linalg.norm(centroids, axis=1)
      cosine = np.inner(X,centroids) # cosine[i, j] = np.dot(X[i, :],centroids[j,:])
      cosine = cosine/center_norms # divide each column by the center norm
      cosine = cosine / data_norms[:,np.newaxis] # divide each row by the data norm  
      max_cosine = np.abs(np.max(cosine, 1)) # the largest (absolute) cosine for each data point 
  
      # then we find the index of the new center:
      new_center_index = np.argmin(max_cosine) # the data index of the new center is the smallest max cosine
      new_center = X[new_center_index, :]       
      return new_center_index,new_center
docs: Initialize the centrodis by orthogonal_initialization.
      Parameters    
      --------------------
      X(data): array-like, shape= (m_samples,n_samples)
      data_norms: array-like, shape=(1,n_samples)
      center_norms:array-like,shape=(centroids.shape[0])
      centroids: array-like, shape (K,n_samples)        
      Returns
      -------
      new_center: array-like, shape (1,n_samples)
      new_center_index: integer   
                          data index of the new center