[机器学习 05] 无监督学习(聚类,降维)-sklearn

无监督学习

1. 聚类

(1)Kmeans:给定K值,将数据分成K类,且得到每类数据的中心。★
(缺点:需要初始化K个类中心点,因此最后的效果好坏和初始点的选择有一定关系。)

基本思想:在给定K值和K个初始类簇中心点的情况下,把每个点(亦即数据记录)分到离其最近的类簇中心点所代表的类簇中,所有点分配完毕之后,根据一个类簇内的所有点重新计算该类簇的中心点(取平均值),然后再迭代的进行分配点和更新类簇中心点的步骤,直至类簇中心点的变化很小,或者达到指定的迭代次数 。

步骤:
① 从数据集中随机选取K个样本作为初始聚类中心C;
② 针对数据集中每个样本,计算它们到K个聚类中心的距离并将其分到距离最近的聚类中心所属类别中;
③ 针对每个类别C,重新计算它们的聚类中心;(该类所有已分样本的质心作为新的聚类中心点)
④ 重复步骤②③,直到所有聚类中心的位置都固定。

(2)Kmeans++:对Kmeans初始点的选择又改进,其余步骤相同。初始点选取的基本思路就是聚类中心之间的相互距离要尽可能的远。★

步骤:
① 随机选取一个样本作为第一个聚类中心C1;
② 计算每个样本与当前已有类聚中心最短距离;
③ 距离越远的点,被选取作为聚类中心的概率越大;
④ 最后使用轮盘法选出下一个聚类中心;
⑤ 重复步骤二直到选出K个聚类中心;
⑥ 接下来的步骤与Kmeans一样。

(3)MeanShift 均值迁移:随机选定圆心,画圆,往密度大的方向移动,直到稳定后,该点就是密度最大的,而周围密度都比较均匀,就结束。
(聚类的类别数量与圆的半径有关)

基本思想:在数据集中选定一个点,然后以这个点为圆心,r为半径,画一个圆(二维特征下是圆),并求出这个点到所有点的向量的平均值,而圆心与向量均值的和为新的圆心,然后迭代此过程,直到满足一点的条件结束。

(4)层次聚类:要设置划分的类别K。以下图为例,以距离最近的合并,要分成K类则只要在分成K类的该层停止合并即可。
层次聚类

基本思想:层次法先计算样本之间的距离。每次将距离最近的点合并到同一个类。然后,再计算类与类之间的距离,将距离最近的类合并为一个大类,不停的合并,直到合成一个类。

  • 类之间距离的计算方法:最短距离法,最长距离法,中间距离法,类平均法等。
  • 层次聚类根据层次分解的顺序可分为:自下底向上和自上向下。

(5)密度聚类(DBSCAN):不需要设置K值,可以找到离群点。但是参数不好设置,即圈的大小和minPts(至少包含多少个样本才设置成一个类别,否则当成离群点。)。★

基本思想:由密度可达关系导出最大密度相连的样本集合(聚类)。这样的一个集合中有一个或多个核心对象,如果只有一个核心对象,则簇中其他非核心对象都在这个核心对象的ε邻域内;如果是多个核心对象,那么任意一个核心对象的ε邻域内一定包含另一个核心对象(否则无法密度可达)。这些核心对象以及包含在它ε邻域内的所有样本构成一个类。

基本概念:
① 邻域:对于任意给定样本x和距离ε,x的ε邻域是指到x距离不超过ε的样本的集合;
② 核心对象:若样本x的邻域ε内至少包含minPts个样本,则x是一个核心对象;
③ 密度直达:若样本b在a的ε邻域内,且a是核心对象,则样本b右样本a密度直达;
④ 密度可达:对于样本a,b,如果存在样例p1,p2,…,pn,其中,p1=a,pn=b,且序列中每一个样本都与它前一个样本密度直达,则称样本a与b密度可达;
⑤ 密度相连:对于样本a和b,若存在样本k使得a与k密度可达,且k与b密度可达,则a与b密度相连。
以下图为例:minPts=3时,虚线圈表示邻域。

  • x1是核心对象;
  • x2由x1密度直达;
  • x3由x1密度可达,x4由x1密度可达;
  • x3与x4密度相连,x2与x4密度相连

密度聚类
(6)AP聚类(AffinityPropagation):AP算法不需要事先指定聚类数目,相反它将所有的数据点都作为潜在的聚类中心。

AP算法中传递两种类型的消息, (responsiility)和(availability) 。r(i,k)表示从点i发送到候选聚类中心k的数值消息,反映k点是否适合作为i点的聚类中心。a(i,k)则从候选聚类中心k发送到i的数值消息,反映i点是否选择k作为其聚类中心。r (i, k)与a (i, k)越强,则k点作为聚类中心的可能性就越大,并且i点隶属于以k点为聚类中心的聚类的可能性也越大。AP算法通过迭代过程不断更新每一个点的吸引度和归属度值,直到产生m个高质量的exemplar,同时将其余的数据点分配到相应的聚类中。

(7)谱聚类(Spectral Clustering):需要设置K值。★

谱聚类是一种基于图论的聚类方法,通过对样本数据的拉普拉斯矩阵的特征向量进行聚类,从而达到对样本数据聚类的目的。谱聚类可以理解为将高维空间的数据映射到低维,然后在低维空间用其它聚类算法(如KMeans)进行聚类。

这种聚类方法得到的是每个样本点属于各个类的概率,而不是判定它完全属于一个类,所以有时也会被称为软聚类。

(8)高斯混合模型:计算数据的分布,使用分布去拟合数据。★

  1. 针对服从高斯分布的数据集效果非常好。例如:中心密集,四周稀疏的数据。
  2. 本质就是很多个高斯模型组成,把很多写成k个高斯模型组成,根据高斯概率计算每个样本所属的类别,将数据集分成k类。(需要给定K值)
  3. K个高斯模型,每个高斯模型由两个参数构成μ、δ,则K个高斯模型由2k个参数,假定给定的数据是由某个高斯分布产生,利用EM算法,对整个高斯分布做参数估计,得到一个最佳的高斯分布模型。
  4. EM算法:最大期望算法,是在概率模型中寻找参数最大似然估计或者最大先验估计的算法,其中概率模型依赖于无法观测的隐性变量。(固定参数求值,固定值求参数)EM算法实例讲解
    ① 初始化分布参数,并重复下面两个步骤直到收敛;
    ② E步:根据参数初始值或上次迭代的模型参数来计算出隐性变量的后验概率,其实就是隐性变量的期望。作为隐藏变量的现估计值。
    ③ M步:将似然函数最大化以获得新的参数值。
import matplotlib.pyplot as plt

from sklearn.mixture import GaussianMixture
from sklearn.datasets import samples_generator
from sklearn import metrics, cluster

#生成不同的数据集进行测试
# X, _ = samples_generator.make_blobs(n_samples=200, centers=2, cluster_std=0.60, random_state=0)
X, y_true = samples_generator.make_moons(200, noise=.05, random_state=0)
# X, y_true = samples_generator.make_circles(200, noise=0.05, random_state=0,factor=0.4)

#选择不同的聚类算法
# gmm = GaussianMixture(n_components=2) # 高斯混合
# gmm = cluster.MeanShift() # 均值迁移
# gmm = cluster.KMeans(4,init='random') # init不设置,默认情况是Kmeans++
# gmm = cluster.AgglomerativeClustering(2) # 层次聚类
# gmm = cluster.AffinityPropagation() # AP聚类
gmm = cluster.SpectralClustering(2,affinity="nearest_neighbors") # 谱聚类 
# gmm = cluster.DBSCAN() # 密度聚类
labels = gmm.fit_predict(X)

print(metrics.silhouette_score(X, labels))
print(metrics.calinski_harabasz_score(X, labels))
print(metrics.davies_bouldin_score(X, labels))

plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis');
plt.show()

2. 降维

在一般数据中,原始数据可能由很多个特征,但是真正起到作用的特征可能很少,相反有些特征对数据的作用很小甚至是不起作用。因此如果我们不看这些无用的特征,不仅可以去除噪声降低误差,还能很大的减少计算量。因此我们对数据进行预处理的时候可以使用降维。
应用:① 数据压缩;② 数据可视化;(降维到2D/3D)

(1)PCA (主成分分析 Principal Components Analysis)

PCA主成分分析算法,是一种线性降维,将高维坐标系映射到低维坐标系中。

通俗理解PCA

from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d

# 载入样本
iris = load_iris()
X, y = iris.data, iris.target

# 降维、设置参数
pca3 = PCA(n_components=3)  # 降到3d
X3 = pca3.fit_transform(X)
print(pca3.explained_variance_ratio_)

pca2 = PCA(n_components=2)  # 降到2d
X2 = pca2.fit_transform(X)
print(pca2.explained_variance_ratio_)

# 绘图
ax = mplot3d.Axes3D(plt.figure(figsize=(4, 3)))
ax.scatter(X3[:, 0], X3[:, 1], X3[:, 2], s=88, c=y, alpha=0.5)
plt.show()

plt.scatter(X2[:, 0], X2[:, 1], s=88, c=y, alpha=0.5)
plt.show()

(2)LDA(线性判别分析 Linear Discriminant Analysis)

LDA算法既可以用来降维,又可以用来分类,但是目前来说,主要还是用于降维。在我们进行图像识别图像识别相关的数据分析时,LDA是一个有力的工具。

我也搞不懂啊,看这里吧。

from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

# 载入样本
iris = load_iris()
X, y = iris.data, iris.target

# 降维、设置参数
lda3 = LinearDiscriminantAnalysis(n_components=3)
lda3.fit(X, y)
X3 = lda3.transform(X)
print(lda3.explained_variance_ratio_)

# 绘图
plt.scatter(X3[:, 0], X3[:, 1], s=88, c=y, alpha=0.5)
plt.show()

猜你喜欢

转载自blog.csdn.net/weixin_41809530/article/details/107047373
今日推荐