anchor.diff:                  yield words }
   
                   
  -let lable,data =
  +let lables,data =
       fromFileWithSep ',' (__SOURCE_DIRECTORY__ + "/data/irisData.csv")
       |> Seq.skip 1
       |> Seq.map (fun arr -> arr.[4], [| float arr.[0]; float arr.[1]; float arr.[2]; float arr.[3]; |])
       |> Seq.toArray
  +    |> fun x -> Array.init 3 (fun _ -> x) |> Array.concat
       |> Array.shuffleFisherYates
  +    |> Array.mapi (fun i (lable,data) -> sprintf "%s_%i" lable i, data)
       |> Array.unzip
      
   (*** hide ***)
  
positive.code:     <| data <| 4
  
  let clusteredIrisData =
      Array.zip lable data
      |> Array.sortBy (fun (l,dataPoint) -> fst (kmeansResult.Classifier dataPoint)) 
      |> Array.unzip
      |> fun (l,d) -> 
          let labels = l |> Seq.mapi (fun i x -> x + string i)
          Chart.Heatmap(d,ColNames=colnames,RowNames=labels,Colorscale=colorscaleValue,Showscale=true)
          |> Chart.withMarginSize(Left=250.)
          |> Chart.withTitle "clustered iris data (k-means clustering)"
  
negative.code:     StyleParam.Colorscale.Electric //Custom [(0.0,"#3D9970");(1.0,"#001f3f")]
      
  let dataChart = 
      Chart.Heatmap(data,ColNames=colnames,RowNames=lables,Colorscale=colorscaleValue,Showscale=true)
      |> Chart.withMarginSize(Left=250.)
      |> Chart.withTitle "raw iris data"
  (*** include-value:dataChart ***)
  
  
  (**
  ##Iterative Clustering
  
  ###k-means clustering
  
  In k-means clustering a cluster number has to be specified prior to clustering the data. K centroids are randomly chosen.
  After all data points are assigned to their nearest centroid, the algorithm iteratively approaches a centroid position configuration,
  that minimizes the dispersion of every of the k clusters.
  For cluster number determination see below (Determining the optimal number of clusters).
  *)
  
  open FSharp.Stats.ML
  open FSharp.Stats.ML.Unsupervised
  
  
  // Kmeans clustering
  