kunlong00 2018-04-08
无监督机器学习是机器学习任务,推断用“未标记”数据描述隐藏结构的功能(分类或分类不包括在观察中)。使用无监督学习算法的常见场景包括:
数据挖掘
异常值检测
模式识别
最常见和最简单的聚类算法就是K-Means聚类。该算法涉及您告诉算法数据集中有多少可能的聚类(或K)。该算法然后迭代地移动k中心并选择最接近该群集中的质心的数据点。
以K = 3为例,迭代过程如下:
可能想到的一个明显问题是选择K值的方法。这是通过使用弯曲曲线完成的,其中x轴是K值,y轴是一些目标函数。一个共同的目标函数是数据点和最近质心之间的平均距离。Python代码如下:
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
%matplotlib inline
from sklearn import datasets
#Iris Dataset
iris = datasets.load_iris()
X = iris.data
#Kmeans
km = KMeans(n_clusters=3)
km.fit(X)
km.predict(X)
labels = km.labels_
#Plotting
fig = plt.figure(1, figsize=(7,7))
ax = Axes3D(fig, rect=[0, 0, 0.95, 1], elev=48, azim=134)
ax.scatter(X[:, 3], X[:, 0], X[:, 2],
c=labels.astype(np.float), edgecolor="k", s=50)
ax.set_xlabel("Petal width")
ax.set_ylabel("Sepal length")
ax.set_zlabel("Petal length")
plt.title("K Means", fontsize=14)
K-means的一个问题,如上面的3D图中所示,它是硬标签。但是,您可以看到紫色和黄色群集边界处的数据点可以是任意一个。对于这种情况,可能需要采取不同的方法。
在K-Means中,我们做所谓的“硬标签”,我们只需添加最大概率的标签。然而,在群集边界存在的某些数据点可能只是在任一群集上具有相似的概率。在这种情况下,我们看所有的概率,而不是最大概率。这被称为“软标签”。
from sklearn.mixture import GaussianMixture
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
%matplotlib inline
from sklearn import datasets
#Iris Dataset
iris = datasets.load_iris()
X = iris.data
#Kmeans
gmm = GaussianMixture(n_components=3)
gmm.fit(X)
proba_lists = gmm.predict_proba(X)
#Plotting
colored_arrays = np.matrix(proba_lists)
colored_tuples = [tuple(i.tolist()[0]) for i in colored_arrays]
fig = plt.figure(1, figsize=(7,7))
ax = Axes3D(fig, rect=[0, 0, 0.95, 1], elev=48, azim=134)
ax.scatter(X[:, 3], X[:, 0], X[:, 2],
c=colored_tuples, edgecolor="k", s=50)
ax.set_xlabel("Petal width")
ax.set_ylabel("Sepal length")
ax.set_zlabel("Petal length")
plt.title("Gaussian Mixture Model", fontsize=14)
对于上述高斯混合模型,数据点的颜色是基于靠近聚类的高斯概率。RGB值基于每个红色,蓝色和绿色群集的接近度。如果您查看蓝色和红色群集边界附近的数据点,则会看到紫色,表明数据点靠近任一群集。
既然我们已经谈到了数值,让我们转向分类值。一个这样的应用是文本分析。这种问题的常见方法是主题建模,即将文档中的文档或单词分类为主题。其中最简单的是TF-IDF模型。TF-IDF模型根据词的重要性对词进行分类。这取决于他们在特定文件(例如科学期刊中的特定科学主题)中的频率以及所有文件中常见的词语(例如停用词)。
我最喜欢的算法之一是潜在Dirichlet分配或LDA模型。在这个模型中,文档中的每个单词都会根据整个文档语料库给出一个主题。下面,我附上了华盛顿大学机器学习专业课程的幻灯片:
LDA模型背后的机制本身很难在这个博客中解释。然而,人们常见的问题是决定主题的数量。虽然没有确定的答案,但我个人更倾向于实现每个文档的单词向量的K均值的肘形曲线。每个单词矢量的接近度可以由余弦距离确定。
最后,我们介绍一些时间序列分析。对于聚类,我最喜欢使用隐马尔可夫模型或HMM。在马尔科夫模型中,我们寻找状态以及给定当前状态的下一个状态的概率。下面的例子是狗在马尔可夫模型中的生活。
我们假设这条狗病了。鉴于目前的状况,下一个小时将有0.6次机会继续生病,正在睡眠0.4次,正在进食05次,0.1次进食,0.4次将会恢复健康。在HMM中,您提供了时间序列数据内可能有多少个状态用于计算模型。波士顿房价数据集的一个例子在下面给出了3个州。
from hmmlearn import hmm
import numpy as np
%matplotlib inline
from sklearn import datasets
#Data
boston = datasets.load_boston()
ts_data = boston.data[1,:]
#HMM Model
gm = hmm.GaussianHMM(n_components=3)
gm.fit(ts_data.reshape(-1, 1))
states = gm.predict(ts_data.reshape(-1, 1))
#Plot
color_dict = {0:"r",1:"g",2:"b"}
color_array = [color_dict[i] for i in states]
plt.scatter(range(len(ts_data)), ts_data, c=color_array)
plt.title("HMM Model")
与每个聚类问题一样,决定状态的数量也是一个常见问题。这可能是基于域的。例如在语音识别中,通常使用3种状态。另一种可能性是使用肘部曲线。
正如我在本博客开头提到的那样,我无法覆盖那里的每一个无监督模型。同时,根据您的使用情况,您可能需要结合使用算法才能获得相同数据的不同视角。因此,我希望通过Scikit-Learn关于玩具数据集的着名的集群演示,让您不用担心: