# Using Cosine Similarity for KMeans clustering

**URL:** <https://discourse.julialang.org/t/using-cosine-similarity-for-kmeans-clustering/54898>\
**Category:** General Usage\
**Created:** [February 9, 2021, 7:12am UTC](https://discourse.julialang.org/t/using-cosine-similarity-for-kmeans-clustering/54898 "2021-02-09T07:12:00Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![BobPen](https://avatars.discourse-cdn.com/v4/letter/b/ebca7d/32.png) [@BobPen](https://discourse.julialang.org/u/BobPen)\
**Post date:** [February 9, 2021, 7:12am UTC](https://discourse.julialang.org/t/using-cosine-similarity-for-kmeans-clustering/54898/1 "2021-02-09T07:12:01Z")

</div>

I am making with an implementation of K-means clustering in Julia.

**Figure out, and implement a modification of k-means that alternatively measure similarity by the angle between vectors.**

So I assumed that one could use Cosine Similarity for this, I have made the code work with regular K-means by calculating th squared Euclidian Distance, by this:

```julia
Distances[:,i] = sum((X.-C[[i],:]).^2, dims=2) # Where C is center, Distances are added using the i-th center

```

I tried to do this by using cosine similarity such as this:

```julia
Distances[:, i] = sum(1 .- ((X*C[[i], :]).^2 /(sum(X.^2, dims=2).*(C[[i],:]'*C[[i],:]))))

```

But this seems to not be working.

Alternatively I tried:

```nohighlight
clust_center = C[[i], :]
curr_dist = 0
for currx = 1:size(X)[1]
    curr_dist = curr_dist+ evaluate(CosineDist(), X[currx, :], clust_center)
end
Distances[:,i] = curr_dist

```

But then I get the error:

```julia
ArgumentError: indexed assignment with a single value to many locations is not supported; perhaps use broadcasting `.=` instead?

```

Have I misunderstood the question or am I implementing it wrong?

---

<div class="post-metadata">

**Author:** ![tlienart](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tlienart/32/7640_2.png) [@tlienart](https://discourse.julialang.org/u/tlienart)\
**Post date:** [February 9, 2021, 9:14am UTC](https://discourse.julialang.org/t/using-cosine-similarity-for-kmeans-clustering/54898/2 "2021-02-09T09:14:26Z")

</div>

You might want to look at the code in Distances.jl for cosine distance: [https://github.com/JuliaStats/Distances.jl/blob/fa867d59098dd848fd71bc48005a1bf858928a47/src/metrics.jl#L399-L412](https://github.com/JuliaStats/Distances.jl/blob/fa867d59098dd848fd71bc48005a1bf858928a47/src/metrics.jl#L399-L412)

Also this:

```julia
Distances[:, i] = sum(1 .- ((X*C[[i], :]).^2 /(sum(X.^2, dims=2).*(C[[i],:]'*C[[i],:]))))

```

use `.=` maybe check the [docs for broadcasting](https://docs.julialang.org/en/v1/manual/arrays/#Broadcasting).

---

<div class="post-metadata">

**Author:** ![BobPen](https://avatars.discourse-cdn.com/v4/letter/b/ebca7d/32.png) [@BobPen](https://discourse.julialang.org/u/BobPen)\
**Post date:** [February 9, 2021, 12:04pm UTC](https://discourse.julialang.org/t/using-cosine-similarity-for-kmeans-clustering/54898/3 "2021-02-09T12:04:39Z")

</div>

Thank you! I was checking out the Distances github, but I was unable to find the code for Cosine Distance. That was my fault. I managed to get it to work after taking a look at the code.
