【Python】机器学习笔记10-高斯混合模型(Gaussian Mixture Model)

本文主要是介绍【Python】机器学习笔记10-高斯混合模型(Gaussian Mixture Model),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文的参考资料:《Python数据科学手册》;
本文的源代上传到了Gitee上;

本文用到的包:

%matplotlib inline
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.patches import Ellipsefrom sklearn.datasets import make_blobs, make_moons, load_digits
from sklearn.cluster import KMeans
from sklearn.mixture import GaussianMixture
from sklearn.decomposition import PCAsns.set()
plt.rc('font', family='SimHei')
plt.rc('axes', unicode_minus=False)

高斯混合模型GMM

理解K-means算法的缺陷

理解K-means模型的一种方法是:它在以每一个簇的中心为圆心画了一个圆,圆的半径是这一簇中的与簇中心距离最远的点到簇中心的距离,基于上述判断,对K-means聚类的可视化如下所示:

n_clusters = 4
x_train, y_true = make_blobs(n_samples=200, centers=n_clusters,cluster_std=1.5, random_state=233,
)fig, axs = plt.subplots(1, 2, figsize=(16, 8))  # type: plt.Figure, np.ndarray
ax_data = axs[0]  # type: plt.Axes
ax_pred = axs[1]  # type: plt.Axesmodel = KMeans(n_clusters=n_clusters)
y_pred = model.fit_predict(x_train)cm = plt.cm.get_cmap('rainbow', lut=n_clusters)
fig.suptitle('K-means应用于圆形聚类数据(正常工作)')
ax_data.scatter(x=x_train[:, 0], y=x_train[:, 1], c=y_true, edgecolors='k', alpha=0.6, cmap=cm)
ax_data.axis('equal')
ax_data.set_title('训练数据')ax_pred.scatter(x=x_train[:, 0], y=x_train[:, 1], c=y_pred, edgecolors='k', alpha=0.6, cmap=cm)
for i in range(n_clusters):center = model.cluster_centers_[i, :]dot = x_train[y_pred == i]r = 0for j in range(dot.shape[0]):dx = center[0] - dot[j, 0]dy = center[1] - dot[j, 1]r = max(r, np.sqrt(dx ** 2 + dy ** 2))ax_pred.add_patch(plt.Circle(xy=center, radius=r, alpha=0.3, lw=3, fc='gray'))
ax_pred.axis('equal')
ax_pred.set_title('K-means聚类结果')

在这里插入图片描述

在这样的工作方式之下,每一个数据点到簇中心的距离会被作为训练集分配簇的硬切断(只能定性的判断每一个数据点属于哪一个簇,不能计算概率);同时,这也意味着K-means要求数据是接近圆形的分布,所以,如果我们对数据进行一些线性变换,K-means就会失效,如图下面的示例所示:

n_clusters = 4
x_train, y_true = make_blobs(n_samples=200, centers=n_clusters,cluster_std=1.5, random_state=233,
)
rng = np.random.RandomState(seed=13)
x_train = np.dot(x_train, rng.randn(2, 2))model = KMeans(n_clusters=n_clusters)
y_pred = model.fit_predict(x_train)fig, axs = plt.subplots(1, 2, figsize=(16, 8))  # type: plt.Figure, np.ndarray
ax_data = axs[0]  # type: plt.Axes
ax_pred = axs[1]  # type: plt.Axescm = plt.cm.get_cmap('rainbow', lut=n_clusters)
fig.suptitle('K-means应用于非圆形聚类数据(失效)')
ax_data.scatter(x=x_train[:, 0], y=x_train[:, 1], c=y_true, edgecolors='k', alpha=0.6, cmap=cm)
ax_data.axis('equal')
ax_data.set_title('训练数据')ax_pred.scatter(x=x_train[:, 0], y=x_train[:, 1], c=y_pred, edgecolors='k', alpha=0.6, cmap=cm)
for i in range(n_clusters):center = model.cluster_centers_[i, :]dot = x_train[y_pred == i]r = 0for j in range(dot.shape[0]):dx = center[0] - dot[j, 0]dy = center[1] - dot[j, 1]r = max(r, np.sqrt(dx ** 2 + dy ** 2))ax_pred.add_patch(plt.Circle(xy=center, radius=r, alpha=0.3, lw=3, fc='gray'))
ax_pred.axis('equal')
ax_pred.set_title('K-means聚类结果')

在这里插入图片描述

一般化的E-M:高斯混合模型(Gaussian Mixture Model)

从K-means存在的缺点出发,可以提出如下的改进意见:例如可以比较数据点与所有的簇中心的距离从而衡量这个点分配到每一个簇的概率,或者将簇的边界由正圆变为椭圆来来得到不同形状的簇,这两个改进意见构成了GMM的两个基本部分。

期望最大化应用于GMM的步骤:

  • 确定初始簇的位置和形状
  • 重复一下步骤直至结果收敛:
    • 为每一个点找到对应属于每个簇的概率作为权重
    • 更新每个簇的位置,将其标准化,并给予所有数据点的权重来确定簇的形状

在sklearn中,高斯混合模型由GaussianMixture类实现,这个类的covariance_type参数控制了每一个簇的形状自由度;

covariance_type=diag时,簇在每个维度的尺寸可以单独设置,但是椭圆的边界与主轴坐标平行;

covariance_type=spherical时,簇在每个维度上的尺寸相等,效果类似于K-means;

covariance_type=full时,允许每一个簇在任意方向上改变尺寸;

在之前的数据上使用高斯混合模型,效果如下:

n_clusters = 4
x_train, y_true = make_blobs(n_samples=200, centers=n_clusters,cluster_std=1.5, random_state=233,
)
rng = np.random.RandomState(seed=13)
x_train = np.dot(x_train, rng.randn(2, 2))model = GaussianMixture(n_components=n_clusters, covariance_type='full')
model.fit(x_train)
y_pred = model.predict(x_train)
y_prob = model.predict_proba(x_train)fig, axs = plt.subplots(1, 2, figsize=(16, 8))  # type: plt.Figure, list
ax_data = axs[0]  # type: plt.Axes
ax_pred = axs[1]  # type: plt.Axes
cm = plt.cm.get_cmap('rainbow', lut=4)ax_data.scatter(x=x_train[:, 0], y=x_train[:, 1], c=y_true, edgecolors='k', alpha=0.5, cmap=cm)
ax_data.set_title('训练数据')ax_pred.scatter(x=x_train[:, 0], y=x_train[:, 1], c=y_pred, s=50 * y_prob.max(axis=1) ** 4,edgecolors='k', alpha=0.5, cmap=cm,
)
for pos, cov, w in zip(model.means_, model.covariances_, model.weights_):  # 椭圆的画法就照抄书本了u, s, vt = np.linalg.svd(cov)angle = np.degrees(np.arctan2(u[1, 0], u[0, 0]))width, height = 2 * np.sqrt(s)for nsig in range(1, 4):ax_pred.add_patch(Ellipse(pos, nsig * width, nsig * height, angle,alpha=w,))
ax_pred.set_title(f'GMM聚类结果,协方差类型选择为:{model.covariance_type}')fig.suptitle('展示GMM强大的聚类效果')

(这里以概率大小作为了每一个点的尺寸)

在这里插入图片描述

将GMM用于密度估计

虽然我们这里将GMM当作聚类算法进行介绍,但是GMM在本质上是一个密度估计算法,用于描述数据分布的生成概率模型

例如,下面我们使用一个16簇的GMM模型拟合数据,然后通过拟合得到的16个成分的分布情况并生成新的数据;

n_clusters=16
fig, axs = plt.subplots(1, 3, figsize=(18, 6))  # type: plt.Figure, list
ax_data, ax_model, ax_resample = (i for i in axs)  # type: plt.Axes, plt.Axes, plt.Axes
cm = plt.cm.get_cmap('rainbow', lut=n_clusters)x_train, y_true = make_moons(n_samples=300, random_state=233, noise=0.05)
model = GaussianMixture(n_components=n_clusters, covariance_type='full')model.fit(x_train)
y_pred = model.predict(x_train)
y_prob = model.predict_proba(x_train)
x_resample = model.sample(n_samples=400)[0]ax_data.scatter(x=x_train[:, 0], y=x_train[:, 1], c=y_true, edgecolors='k', alpha=0.5, cmap=cm)
ax_data.set_title('训练数据')ax_model.scatter(x=x_train[:, 0], y=x_train[:, 1], c=y_pred, s=50 * y_prob.max(axis=1) ** 4,edgecolors='k', alpha=0.5, cmap=cm,
)
for pos, cov, w in zip(model.means_, model.covariances_, model.weights_):  # 椭圆的画法就照抄书本了u, s, vt = np.linalg.svd(cov)angle = np.degrees(np.arctan2(u[1, 0], u[0, 0]))width, height = 2 * np.sqrt(s)for nsig in range(1, 4):ax_model.add_patch(Ellipse(pos, nsig * width, nsig * height, angle,alpha=2.33 * w,))
ax_model.set_title(f'模型训练之后得到的{model.n_components}个簇的分布情况')ax_resample.scatter(x=x_resample[:, 0], y=x_resample[:, 1], c='blue', edgecolors='k', alpha=0.3, cmap=cm)
ax_resample.set_title('通过GMM生成新数据')fig.suptitle('GMM用于密度估计(老本行)')

在这里插入图片描述

既然要使用GMM来进行密度估计,就会牵扯到到底要使用多少个簇的问题,sklearn中的GMM模型内置了两种度量准则:**赤池信息量准则(AIC)贝叶斯信息准则(BIC)**来帮助我们确定GMM模型的最佳成分数;

一般来讲,对应AIC或者BIC最小的成分数是最佳的;
AIC和BIC两个指标可以由GaussianMixture类的aic函数和bic函数计算;

models = [GaussianMixture(n_components=i, random_state=233, covariance_type='full').fit(x_train) for i in range(1, 20 + 1)]
aic = [m.aic(x_train) for m in models]
bic = [m.bic(x_train) for m in models]plt.figure(figsize=(10, 10))
plt.plot(range(1, 20 + 1), aic, label='AIC')
plt.plot(range(1, 20 + 1), bic, label='BIC')
plt.legend(loc='upper right')
plt.title('GMM的AIC与BIC')

在这里插入图片描述

案例:使用GMM生成新的手写数字

由于我们使用的手写数字由64维,而GMM在高维数据中可能不太会收敛,我们首先使用PCA进行降维,保留99%的方差;

将数据降维之后,我们使用GMM内置的AIC和BIC函数计算不同成分数下模型的这两个指标,确定最后使用的成分数,这里选择100个成分;

最后使用训练好的GMM模型生成数据,然后使用之前的PCA模型将数据重新转换至64维,并显示,查看效果;

降维并确定成分数:

digits = load_digits()pca = PCA(n_components=0.99, whiten=True)
digits_data_reduced = pca.fit_transform(digits.data)
print(f'原始数据维度:{digits.data.shape[-1]}')
print(f'使用PCA降维并保留{pca.n_components * 100}%方差后的维度:{digits_data_reduced.shape[-1]}')n_components = list(range(50, 200 + 1, 5))
models = [GaussianMixture(n_components=i, covariance_type='full').fit(digits_data_reduced) for i in n_components]
aic = [m.aic(digits_data_reduced) for m in models]
bic = [m.bic(digits_data_reduced) for m in models]plt.figure(figsize=(10, 10))
plt.plot(n_components, aic, label='AIC')
plt.plot(n_components, bic, label='BIC')
plt.legend(loc='upper right')
plt.title('确定对手写数字使用GMM的最佳成分数')

在这里插入图片描述

训练模型并生成新的手写数字:

model = GaussianMixture(n_components=100, covariance_type='full')
model.fit(digits_data_reduced)
digits_new = model.sample(200)[0]
digits_new = pca.inverse_transform(digits_new)
digits_new = digits_new.reshape(digits_new.shape[0], 8, 8)fig, axs = plt.subplots(10, 10, figsize=(12, 12))  # type: plt.Figure, np.ndarray
fig.subplots_adjust(hspace=0.1, wspace=0.1)
fig.suptitle('手写数字-训练数据')
for i, ax in enumerate(axs.flatten()):  # type: int, plt.Axesax.imshow(digits.data[i].reshape(8, 8), cmap='binary', origin='lower')ax.set_xticks([])ax.set_yticks([])ax.text(x=0, y=0, s=str(digits.target_names[digits.target[i]]), color='green')fig, axs = plt.subplots(10, 10, figsize=(12, 12))  # type: plt.Figure, np.ndarray
fig.subplots_adjust(hspace=0.1, wspace=0.1)
fig.suptitle('手写数字-使用GMM学习后生成')
for i, ax in enumerate(axs.flatten()):  # type: int, plt.Axesax.imshow(digits_new[i], cmap='binary', origin='lower')ax.set_xticks([])ax.set_yticks([])

在这里插入图片描述

在这里插入图片描述

我最后做出来的结果并没有书本上的结果那么理想,原因暂时未知;

完整代码(Jupyter Notebook)

#%% md# 高斯混合模型GMM## 理解K-means算法的缺陷理解K-means模型的一种方法是:它在以每一个簇的中心为圆心画了一个圆,圆的半径是这一簇中的与簇中心距离最远的点到簇中心的距离,基于上述判断,
对K-means聚类的可视化如下所示:在这样的工作方式之下,每一个数据点到簇中心的距离会被作为训练集分配簇的**硬切断**(只能定性的判断每一个数据点属于哪一个簇,不能计算概率),
同时,这也意味着K-means要求数据是接近圆形的分布,所以,如果我们对数据进行一些线性变换,K-means就会失效,如图所示:#%%%matplotlib inline
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.patches import Ellipsefrom sklearn.datasets import make_blobs, make_moons, load_digits
from sklearn.cluster import KMeans
from sklearn.mixture import GaussianMixture
from sklearn.decomposition import PCAsns.set()
plt.rc('font', family='SimHei')
plt.rc('axes', unicode_minus=False)#%%n_clusters = 4
x_train, y_true = make_blobs(n_samples=200, centers=n_clusters,cluster_std=1.5, random_state=233,
)fig, axs = plt.subplots(1, 2, figsize=(16, 8))  # type: plt.Figure, np.ndarray
ax_data = axs[0]  # type: plt.Axes
ax_pred = axs[1]  # type: plt.Axesmodel = KMeans(n_clusters=n_clusters)
y_pred = model.fit_predict(x_train)cm = plt.cm.get_cmap('rainbow', lut=n_clusters)
fig.suptitle('K-means应用于圆形聚类数据(正常工作)')
ax_data.scatter(x=x_train[:, 0], y=x_train[:, 1], c=y_true, edgecolors='k', alpha=0.6, cmap=cm)
ax_data.axis('equal')
ax_data.set_title('训练数据')ax_pred.scatter(x=x_train[:, 0], y=x_train[:, 1], c=y_pred, edgecolors='k', alpha=0.6, cmap=cm)
for i in range(n_clusters):center = model.cluster_centers_[i, :]dot = x_train[y_pred == i]r = 0for j in range(dot.shape[0]):dx = center[0] - dot[j, 0]dy = center[1] - dot[j, 1]r = max(r, np.sqrt(dx ** 2 + dy ** 2))ax_pred.add_patch(plt.Circle(xy=center, radius=r, alpha=0.3, lw=3, fc='gray'))
ax_pred.axis('equal')
ax_pred.set_title('K-means聚类结果')#%%n_clusters = 4
x_train, y_true = make_blobs(n_samples=200, centers=n_clusters,cluster_std=1.5, random_state=233,
)
rng = np.random.RandomState(seed=13)
x_train = np.dot(x_train, rng.randn(2, 2))model = KMeans(n_clusters=n_clusters)
y_pred = model.fit_predict(x_train)fig, axs = plt.subplots(1, 2, figsize=(16, 8))  # type: plt.Figure, np.ndarray
ax_data = axs[0]  # type: plt.Axes
ax_pred = axs[1]  # type: plt.Axescm = plt.cm.get_cmap('rainbow', lut=n_clusters)
fig.suptitle('K-means应用于非圆形聚类数据(失效)')
ax_data.scatter(x=x_train[:, 0], y=x_train[:, 1], c=y_true, edgecolors='k', alpha=0.6, cmap=cm)
ax_data.axis('equal')
ax_data.set_title('训练数据')ax_pred.scatter(x=x_train[:, 0], y=x_train[:, 1], c=y_pred, edgecolors='k', alpha=0.6, cmap=cm)
for i in range(n_clusters):center = model.cluster_centers_[i, :]dot = x_train[y_pred == i]r = 0for j in range(dot.shape[0]):dx = center[0] - dot[j, 0]dy = center[1] - dot[j, 1]r = max(r, np.sqrt(dx ** 2 + dy ** 2))ax_pred.add_patch(plt.Circle(xy=center, radius=r, alpha=0.3, lw=3, fc='gray'))
ax_pred.axis('equal')
ax_pred.set_title('K-means聚类结果')#%% md## 一般化的E-M:高斯混合模型(Gaussian Mixture Model)从K-means存在的缺点出发,可以提出如下的改进意见:例如可以比较数据点与所有的簇中心的距离从而衡量这个点分配到每一个簇的概率,或者将簇的边界由正圆
变为椭圆来来得到不同形状的簇,这两个改进意见构成了GMM的两个基本部分。期望最大化应用于GMM的步骤:-   确定初始簇的位置和形状
-   重复一下步骤直至结果收敛:-   为每一个点找到对应属于每个簇的概率作为权重-   更新每个簇的位置,将其标准化,并给予所有数据点的权重来确定簇的形状在sklearn中,高斯混合模型由GaussianMixture类实现,这个类的covariance_type参数控制了每一个簇的形状自由度;<br>
covariance_type=diag时,簇在每个维度的尺寸可以单独设置,但是椭圆的边界与主轴坐标平行;<br>
covariance_type=spherical时,簇在每个维度上的尺寸相等,效果类似于K-means;<br>
covariance_type=full时,允许每一个簇在任意方向上改变尺寸;#%%n_clusters = 4
x_train, y_true = make_blobs(n_samples=200, centers=n_clusters,cluster_std=1.5, random_state=233,
)
rng = np.random.RandomState(seed=13)
x_train = np.dot(x_train, rng.randn(2, 2))model = GaussianMixture(n_components=n_clusters, covariance_type='full')
model.fit(x_train)
y_pred = model.predict(x_train)
y_prob = model.predict_proba(x_train)fig, axs = plt.subplots(1, 2, figsize=(16, 8))  # type: plt.Figure, list
ax_data = axs[0]  # type: plt.Axes
ax_pred = axs[1]  # type: plt.Axes
cm = plt.cm.get_cmap('rainbow', lut=4)ax_data.scatter(x=x_train[:, 0], y=x_train[:, 1], c=y_true, edgecolors='k', alpha=0.5, cmap=cm)
ax_data.set_title('训练数据')ax_pred.scatter(x=x_train[:, 0], y=x_train[:, 1], c=y_pred, s=50 * y_prob.max(axis=1) ** 4,edgecolors='k', alpha=0.5, cmap=cm,
)
for pos, cov, w in zip(model.means_, model.covariances_, model.weights_):  # 椭圆的画法就照抄书本了u, s, vt = np.linalg.svd(cov)angle = np.degrees(np.arctan2(u[1, 0], u[0, 0]))width, height = 2 * np.sqrt(s)for nsig in range(1, 4):ax_pred.add_patch(Ellipse(pos, nsig * width, nsig * height, angle,alpha=w,))
ax_pred.set_title(f'GMM聚类结果,协方差类型选择为:{model.covariance_type}')fig.suptitle('展示GMM强大的聚类效果')#%% md## 将GMM用于密度估计虽然我们这里将GMM当作聚类算法进行介绍,但是GMM在本质上是一个**密度估计算法**,用于描述**数据分布的生成概率模型**<br>
例如,下面我们使用一个16簇的GMM模型拟合数据,然后通过拟合得到的16个成分的分布情况生成新的数据;<br>既然要使用GMM来进行密度估计,就会牵扯到到底要使用多少个簇的问题,sklearn中的GMM模型内置了两种度量准则:**赤池信息量准则(AIC)****贝叶斯信息准则(BIC)**来帮助我们确定GMM模型的最佳成分数;<br>
一般来讲,对应AIC或者BIC最小的成分数是最佳的;#%%n_clusters=16
fig, axs = plt.subplots(1, 3, figsize=(18, 6))  # type: plt.Figure, list
ax_data, ax_model, ax_resample = (i for i in axs)  # type: plt.Axes, plt.Axes, plt.Axes
cm = plt.cm.get_cmap('rainbow', lut=n_clusters)x_train, y_true = make_moons(n_samples=300, random_state=233, noise=0.05)
model = GaussianMixture(n_components=n_clusters, covariance_type='full')model.fit(x_train)
y_pred = model.predict(x_train)
y_prob = model.predict_proba(x_train)
x_resample = model.sample(n_samples=400)[0]ax_data.scatter(x=x_train[:, 0], y=x_train[:, 1], c=y_true, edgecolors='k', alpha=0.5, cmap=cm)
ax_data.set_title('训练数据')ax_model.scatter(x=x_train[:, 0], y=x_train[:, 1], c=y_pred, s=50 * y_prob.max(axis=1) ** 4,edgecolors='k', alpha=0.5, cmap=cm,
)
for pos, cov, w in zip(model.means_, model.covariances_, model.weights_):  # 椭圆的画法就照抄书本了u, s, vt = np.linalg.svd(cov)angle = np.degrees(np.arctan2(u[1, 0], u[0, 0]))width, height = 2 * np.sqrt(s)for nsig in range(1, 4):ax_model.add_patch(Ellipse(pos, nsig * width, nsig * height, angle,alpha=2.33 * w,))
ax_model.set_title(f'模型训练之后得到的{model.n_components}个簇的分布情况')ax_resample.scatter(x=x_resample[:, 0], y=x_resample[:, 1], c='blue', edgecolors='k', alpha=0.3, cmap=cm)
ax_resample.set_title('通过GMM生成新数据')fig.suptitle('GMM用于密度估计(老本行)')models = [GaussianMixture(n_components=i, random_state=233, covariance_type='full').fit(x_train) for i in range(1, 20 + 1)]
aic = [m.aic(x_train) for m in models]
bic = [m.bic(x_train) for m in models]plt.figure(figsize=(10, 10))
plt.plot(range(1, 20 + 1), aic, label='AIC')
plt.plot(range(1, 20 + 1), bic, label='BIC')
plt.legend(loc='upper right')
plt.title('GMM的AIC与BIC')#%% md## 案例:使用GMM生成新的手写数字由于我们使用的手写数字由64维,而GMM在高维数据中可能不太会收敛,我们首先使用PCA进行降维,保留99%的方差;将数据降维之后,我们使用GMM内置的AIC和BIC函数计算不同成分数下模型的两个标准,确定最后使用的成分数,这里选择100个成分;最后使用训练好的GMM模型生成数据,然后使用之前的PCA模型将数据重新转换至64维,并显示,查看效果;#%%digits = load_digits()pca = PCA(n_components=0.99, whiten=True)
digits_data_reduced = pca.fit_transform(digits.data)
print(f'原始数据维度:{digits.data.shape[-1]}')
print(f'使用PCA降维并保留{pca.n_components * 100}%方差后的维度:{digits_data_reduced.shape[-1]}')n_components = list(range(50, 200 + 1, 5))
models = [GaussianMixture(n_components=i, covariance_type='full').fit(digits_data_reduced) for i in n_components]
aic = [m.aic(digits_data_reduced) for m in models]
bic = [m.bic(digits_data_reduced) for m in models]plt.figure(figsize=(10, 10))
plt.plot(n_components, aic, label='AIC')
plt.plot(n_components, bic, label='BIC')
plt.legend(loc='upper right')
plt.title('确定对手写数字使用GMM的最佳成分数')#%%model = GaussianMixture(n_components=100, covariance_type='full')
model.fit(digits_data_reduced)
digits_new = model.sample(200)[0]
digits_new = pca.inverse_transform(digits_new)
digits_new = digits_new.reshape(digits_new.shape[0], 8, 8)fig, axs = plt.subplots(10, 10, figsize=(12, 12))  # type: plt.Figure, np.ndarray
fig.subplots_adjust(hspace=0.1, wspace=0.1)
fig.suptitle('手写数字-训练数据')
for i, ax in enumerate(axs.flatten()):  # type: int, plt.Axesax.imshow(digits.data[i].reshape(8, 8), cmap='binary', origin='lower')ax.set_xticks([])ax.set_yticks([])ax.text(x=0, y=0, s=str(digits.target_names[digits.target[i]]), color='green')fig, axs = plt.subplots(10, 10, figsize=(12, 12))  # type: plt.Figure, np.ndarray
fig.subplots_adjust(hspace=0.1, wspace=0.1)
fig.suptitle('手写数字-使用GMM学习后生成')
for i, ax in enumerate(axs.flatten()):  # type: int, plt.Axesax.imshow(digits_new[i], cmap='binary', origin='lower')ax.set_xticks([])ax.set_yticks([])

这篇关于【Python】机器学习笔记10-高斯混合模型(Gaussian Mixture Model)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/154699

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了