聚类是一个无监督机器学习。
小白一个,才疏学浅。写的不好大家见谅。
相似度
Jaccard相似系数。(Jarrcard Similarity Coefficient)用于比较有限样本集之间的相似性和差异性。Jarrcard系数值越大,样本相似度越高。
余弦距离,余弦相似度
余弦值的范围在[-1, 1]之间,值越接近于1,代表两个向量的方向越接近
越趋近于-1, 他们的方向越相反; 接近于0, 表示两个向量几乎于正交
最常见的应用就是计算文本相似度。将两个文本根据他们的词,建立两个向量,
计算这两个向量的余弦值,就可以知道两个文本在统计学方法中他们的相似度情况。
簇
本质上,N个样本,映射到K个簇中
每个簇至少有一个样本,一般情况下,一个样本只属于一个簇(也有一个样样本属于多个簇的
最基本:
先给定一个初始划分,迭代改变样本和簇的隶属关系,每次都比前一次好。
K-Means聚类
聚类是一种无监督的机器学习任务,它可以自动将数据划分成类cluster。因此聚类分组不需要提前被告知所划分的组应该是什么样子的。因为我们甚至可能都不知道我们再寻找什么,所以聚类是用于知识发现而不是预测。
聚类原则是一个组内的记录,彼此必须非常相似,而与该组之外的记录截然不同。所有聚类做的就是遍历所有,数据然后找到这些相似性。
选择K个初始的簇中心,随机的(拍脑袋给的),或者先验知识给的某一个样本和某一个聚类中心的距离,计算所属聚类的样本均值
代码实现:
"""
Date: 2019--11 16:24
User: yz
Email: 1147570523@qq.com
Desc:
"""
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.fit_predict(data2)
y3_hat = cls.fit_predict(data3)
# matplotlib.rcParams['font.sans-serif'] = [u'SimHei']
cm = matplotlib.colors.ListedColormap(list('rgbm'))
plt.figure(figsize=(9, 10), facecolor='w