聚类:对大量未标注的数据集,按内在相似性划分为多个类别,类别内相似度大,类之间相似度小。
聚类属于无监督机器学习
回顾一下欧式距离的计算公式:
二维空间的公式:

三维空间的公式:

下面引入相似度:

余弦距离,余弦相似度
余弦值的范围在[-1, 1]之间,值越接近于1,代表两个向量的方向越接近;越趋近于-1, 他们的方向越相反; 接近于0, 表示两个向量几乎于正交。
最常见的应用就是计算文本相似度。将两个文本根据他们的词,建立两个向量,计算这两个向量的余弦值,就可以知道两个文本在统计学方法中他们的相似度情况。
簇:
本质上,N个样本,映射到K个簇中,每个簇至少有一个样本。一般情况下,一个样本只属于一个簇(也有一个样样本属于多个簇的)。
K-Means聚类
聚类是一种无监督的机器学习任务,它可以自动将数据划分成类cluster。因此聚类分组不需要提前被告知所划分的组应该是什么样子的。因为我们甚至可能都不知道我们再寻找什么,所以聚类是用于知识发现而不是预测.
聚类原则
聚类原则是一个组内的记录,彼此必须非常相似,而与该组之外的记录截然不同。所有聚类做的就是遍历所有数据然后找到这些相似性。然后使用距离来分配和更新类。
如下面的图所示:




K-Means 改进
K-Mediods
数组1,2,3,4,100的均值为22, 其实求均值的话,离里面大多数的值还是比较远的,取中位数的话是3, 更好一些, 因为100可能是噪声。
K-Means++
选择初始化簇中心稍微远一点,随机选择第一个,计算每个样本到第一个样本距离,样本距离可以算成概率。
K均值损失函数
假定数据点分布符合高斯分布,K个高斯分布混合得到的样本数据分布。
利用最大似然估计,似然函数取最大值。概率密度相乘, 再各个族似然相乘,找到那些个miu可以使得取最大。这个就是K均值的损失函数,从机器学习角度重新看待,平方误差。
下面通过代码,看一下不同的聚类的不同结果:
# encoding: utf-8
import numpy as np
import matplotlib.pyplot as plt
import sklearn.datasets as ds
import matplotlib.colors
from sklearn.cluster import KMeans
def expand(a, b):
"""
为了扩展x,y轴的长度
"""
d = (b - a) * 0.1
return a-d, b+d
if __name__ == '__main__':
# 创建400个样本
N = 400
# 准备分出4个类别
centers = 4
# 创建聚类的数据(按照4个正太分布创建点)【想看看方差一样的,数据量一样的,分类效果好不好】
data, y = ds.make_blobs(N, n_features=2, centers=centers, random_state=2)
print(data)
# 方差和上面不一样,方差越大,数据集越分散;方差越小,数据集越密集【想看看方差不一样,数据量一样,分类效果好不好】
data2, y2 = ds.make_blobs(N, n_features=2, centers=centers, cluster_std=(1, 2.5, 0.5, 2), random_state=2)
# 从原来数据中选一部分的数据出来【想看看从每条数据里选不同的样本数量的分类效果好不好】
data3 = np.vstack((data[y==0][:], data[y==1][:50], data[y==2][:20], data[y==3][:5]))
# 按道理来说,聚类是不需要y值的,这里的y主要是为了看我们的聚类效果准不准
y3 = np.array([0] * 100 + [1] * 50 + [2] * 20 + [3] * 5)
print(y3)
# k-means++是为了改变初始化的值,所以参数名称是init
cls = KMeans(n_clusters=5, init='k-means++')
y_hat = cls.fit_predict(data)
y2_hat = cls.</

最低0.47元/天 解锁文章
1821

被折叠的 条评论
为什么被折叠?



