[HITML]哈工大2020秋机器学习Lab3实验报告

GitHub仓库


2020年春季学期
计算学部《机器学习》课程


Lab3 实验报告




姓名
学号
班号
电子邮件
手机号码


1 实验目的

实现一个k-means算法和混合高斯模型,并且用EM算法估计模型中的参数。

2 实验要求及实验环境

2.1 实验要求

测试:用高斯分布产生k个高斯分布的数据(不同均值和方差)(其中参数自己设定)。

(1)用k-means聚类,测试效果;

(2)用混合高斯模型和你实现的EM算法估计参数,看看每次迭代后似然值变化情况,考察EM算法是否可以获得正确的结果(与你设定的结果比较)。

应用:可以UCI上找一个简单问题数据,用你实现的GMM进行聚类。

2.2 实验环境

Windows 10, Python 3.8.5, Jupyter notebook

3 实验原理

本实验分为两部分:K-means和GMM,这两部分都是属于EM算法,而EM算法主要分为两步:

  • E步:求期望
  • M步:求最大似然

E步是调整分布,M步是根据E步得到的分布求得当前分布下取到最大似然时的参数,然后更新参数,再次进入E步根据得到的参数调整新的分布,如此往复循环,直到参数收敛。

3.1 K-means

给定训练样本 X = { x 1 , x 2 , . . . , x m } X=\{x_1, x_2, ..., x_m\} X={x1,x2,...,xm},和划分聚类的数量 k k k,给出一个簇划分 C = C 1 , C 2 , . . . , C k C=C_1,C_2,...,C_k C=C1,C2,...,Ck,使得该划分的平方误差 E E E最小化,即使下式取最小值:
E = ∑ i = 1 k ∑ x ∈ C i ∣ ∣ x − μ i ∣ ∣ 2 2 E=\sum^k_{i=1}\sum_{x\in C_i}||x-\mu_i||^2_2 E=i=1kxCixμi22
其中, μ i = 1 ∣ C i ∣ ∑ x ∈ C i x i \mu_i=\frac 1 {|C_i|}\sum_{x\in C_i}x_i μi=Ci1xCixi,它是簇 C i C_i Ci的均值向量。 E E E刻画了簇内样本围绕簇的均值向量的紧密程度, E E E越小簇内样本的相似度越高。

具体迭代过程如下:

  1. 根据输入的超参数 K K K首先初始化一些向量(可以从现有的向量中挑选),作为各簇的均值向量。
  2. 根据初始化的均值向量给出训练样本的一个划分,计算各个训练样本到各个均指向量的距离,找出距离最近的均值向量,并将该样本分至该均值向量所代表的簇。
  3. 根据新的簇划分,重新计算每个簇的均值向量,如果新的均值向量与旧的均值向量差小于 ε \varepsilon ε,则认为算法收敛;否则,更新均值向量,回到第2步重新迭代求解。

K-means算法的流程图如下:

Created with Raphaël 2.2.0 Start 输入期望的聚类数K 随机选取K个样本为初始聚类中心 遍历样本,根据样本到每个 中心的距离确定它的标签 根据得到的标签重新计算样本中心 聚类中心收敛? End yes no

K-means实现:

def kmeans(X, k, epsilon=1e-5):"""K-means算法实现,算得分类结果和中心"""center = np.zeros((k, X.shape[1]-1))for i in range(k):center[i,:] = X[np.random.randint(0, high=X.shape[0]),:-1]while True:distance = np.zeros(k)# 根据中心重新给每个点贴分类标签for i in range(X.shape[0]):for j in range(k):distance[j] = np.linalg.norm(X[i,:-1] - center[j, :])X[i, -1] = np.argmin(distance)# 根据每个点新的标签计算它的中心new_center = np.zeros((k, X.shape[1]-1))count = np.zeros(k)for i in range(X.shape[0]):new_center[int(X[i, -1]), :] += X[i, :-1] # 对每个类的所有点坐标求和count[int(X[i, -1])] += 1for i in range(k):new_center[i, :] = new_center[i, :] / count[i] # 对每个类的所有点坐标求平均值if np.linalg.norm(new_center - center) < epsilon: #用差值的二范数表示精度breakelse:center = new_centerreturn X, center

3.2 GMM

多元高斯分布生成的 d d d 维随机变量 x x x 的密度函数为:
p ( x ∣ μ , Σ ) = 1 ( 2 π ) d 2 ∣ Σ ∣ 1 2 exp ⁡ ( − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) ) p(x|\mu, \Sigma)=\frac 1 {(2\pi)^\frac d 2 |\Sigma|^\frac 1 2}\exp(-\frac 1 2(x-\mu)^T\Sigma^{-1}(x-\mu)) p(xμ,Σ)=(2π)2dΣ211exp(21(xμ)TΣ1(xμ))
其中 μ \mu μ d d d 维的均值向量, Σ \Sigma Σ d × d d\times d d×d 的协方差矩阵。

给定训练样本集 X = { x 1 , x 2 , . . . , x n } X=\{x_1, x_2, ..., x_n\} X={x1,x2,...,xn},它是一个 n × d n\times d n×d 的矩阵, n n n 为样本数量, d d d 为单个样本的维度数量。对于一个样本 x i x_i xi,我们可以认为它是由多个对应维度的多元高斯分布所生成,所以⾼斯分布的线性叠加来表征数据,假设数据由 k k k 个高斯分布混合生成:
p ( x i ) = ∑ j = 1 k π j p ( x i ∣ u j , Σ j ) p(x_i)=\sum^k_{j=1}\pi_jp(x_i|\,u_j, \Sigma_j) p(xi)=j=1kπjp(xiuj,Σj)
其中 μ j \mu_j μj Σ j \Sigma_j Σj 是第 j j j 个高斯分布的均值和协方差矩阵, π j \pi_j πj 为相应的混合系数,满足 ∑ j = 1 k π j = 1 \displaystyle\sum^k_{j=1}\pi_j=1 j=1kπj=1
。因此,我们也可以认为该数据的生成相当于从 k k k 个高斯分布中挑选出一个所生成,我们设 k k k 维二值变量 z z z,这个变量采⽤了 “ 1 − o f − k 1-of-k 1ofk” 表⽰⽅法,其中⼀个特定的元素 z j z_j zj 等于1,其余所有的元素等于0。于是 z j z_j zj 的值满⾜ z j ∈ { 0 , 1 } z_j \in \{0, 1\} zj{0,1} ∑ j z j = 1 \displaystyle\sum_j z_j=1 jzj=1,则 π j \pi_j πj 加权平均概率值可以表征 z z z 的分布,也就是说 z z z 的先验分布为:
p ( z ) = ∏ j = 1 k π j z j p(z)=\prod^k_{j=1} \pi^{z_j}_j p(z)=j=1kπjzj
而在看到 x i x_i xi 的情况下 z z z 的后验概率为:
γ ( z j ) ≡ p ( z j = 1 ∣ x i ) = p ( z j = 1 ) p ( x i ∣ z j = 1 ) p ( x i ) = π j p ( x i ∣ μ j , Σ j ) ∑ l = 1 k π l p ( x i ∣ μ l , Σ l ) \gamma(z_j)\equiv p(z_j = 1|x_i) = \frac{p(z_j = 1)p(x_i|z_j = 1)}{p(x_i)} = \frac{\pi_jp(x_i|\mu_j, \Sigma_j)}{\sum\limits_{l=1}^k\pi_lp({x_i}|{\mu_l}, \Sigma_l)} γ(zj)p(zj=1xi)=p(xi)p(zj=1)p(xizj=1)=l=1kπlp(xiμl,Σl)πjp(xiμj,Σj)

当后验概率已知时,混合高斯模型将训练样本划分成了 k k k 个簇 C = C 1 , C 2 , . . . , C k C = C_1, C_2, ... , C_k C=C1,C2,...,Ck,对于每一个样本 x i x_i xi,其类别为 j j j,满足 j = arg ⁡ max ⁡ j γ ( z j ) j=\arg\displaystyle\max_j \gamma(z_j) j=argjmaxγ(zj),即选择后验概率最大的类别作为标签类别。因此,当我们观测到样本集 X X X 时可以采用极大似然估计来求解样本的类别分布:
ln ⁡ p ( X ∣ π , μ , Σ ) = ln ⁡ ∏ i = 1 n p ( x i ) = ∑ i = 1 n ln ⁡ ∑ j = 1 k π j p ( x i ∣ u j , Σ j ) \ln p(X|\pi, \mu, \Sigma) = \ln \prod_{i=1}^n p(x_i)=\sum_{i=1}^n\ln \sum^k_{j=1}\pi_jp(x_i|\,u_j, \Sigma_j) lnp(Xπ,μ,Σ)=lni=1np(xi)=i=1nlnj=1kπjp(xiuj,Σj)
使上式最大化,对 μ j \mu_j μj 求导令导数为0:
∂ ln ⁡ p ( X ∣ π , μ , Σ ) ∂ μ j = ∑ i = 1 n π j p ( x i ∣ μ j , Σ j ) ∑ l = 1 k π l p ( x i ∣ μ l , Σ l ) Σ j − 1 ( x i − μ j ) = 0 \frac {\partial \ln p(X|\pi, \mu, \Sigma)} {\partial \mu_j} = \sum_{i=1}^n \frac{\pi_j p(x_i| \mu_j, \Sigma_j)}{\displaystyle\sum_{l=1}^k \pi_l p(x_i| \mu_l, \Sigma_l)} \Sigma_j^{-1}(x_i - \mu_j) = 0 μjlnp(Xπ,μ,Σ)=i=1nl=1kπlp(xiμl,Σl)πjp(xiμj,Σj)Σj1(xiμj)=0


γ ( z i j ) = p ( z j = 1 ∣ x i ) ∑ j = 1 k p ( z j = 1 ∣ x i ) = π j p ( x i ∣ μ j , Σ j ) ∑ l = 1 k π l p ( x i ∣ μ l , Σ l ) \gamma(z_{ij}) =\frac {p(z_j = 1|x_i)}{\displaystyle\sum_{j=1}^k p(z_j = 1|x_i)}=\frac{\pi_j p(x_i| \mu_j, \Sigma_j)}{\displaystyle\sum_{l=1}^k \pi_l p(x_i| \mu_l, \Sigma_l)} γ(zij)=j=1kp(zj=1xi)p(zj=1xi)=l=1kπlp(xiμl,Σl)πjp(xiμj,Σj)

则上式解得
n j = ∑ i γ ( z i j ) μ j = 1 n j ∑ i = 1 n γ ( z i j ) x i n_j = \sum_i \gamma(z_{ij})\\ \mu_j = \frac 1 {n_j}\sum_{i=1}^n\gamma(z_{ij})x_i nj=iγ(zij)μj=nj1i=1nγ(zij)xi

同理,对 Σ j \Sigma_j Σj 求导令导数为0:

∂ ln ⁡ p ( X ∣ π , μ , Σ ) ∂ Σ j = ∑ i = 1 n π j p ( x i ∣ μ j , Σ j ) ∑ l = 1 k π l p ( x i ∣ μ l , Σ l ) ( Σ j − 1 − Σ j − 1 ( x i − μ j ) ( x i − μ j ) T Σ j − 1 ) = 0 \frac {\partial \ln p(X|\pi, \mu, \Sigma)} {\partial \Sigma_j} = \sum_{i=1}^n \frac{\pi_j p(x_i| \mu_j, \Sigma_j)}{\displaystyle\sum_{l=1}^k \pi_l p(x_i| \mu_l, \Sigma_l)} (\Sigma_j^{-1} - \Sigma_j^{-1}(x_i -\mu_j)(x_i -\mu_j)^T\Sigma_j^{-1}) = 0 Σjlnp(Xπ,μ,Σ)=i=1nl=1kπlp(xiμl,Σl)πjp(xiμj,Σj)(Σj1Σj1(xiμj)(xiμj)TΣj1)=0
解得
Σ j = ∑ i = 1 n γ ( z i j ) ( x i − μ j ) ( x i − μ j ) T n j \Sigma_j = \frac {\displaystyle\sum_{i=1}^n\gamma(z_{ij})(x_i -\mu_j)(x_i -\mu_j)^T} {n_j} Σj=nji=1nγ(zij)(xiμj)(xiμj)T

对于混合系数 π j \pi_j πj,还需要满足约束条件 ∑ j = 1 k π j = 1 \displaystyle\sum^k_{j=1}\pi_j=1 j=1kπj=1。构造拉格朗日多项式:

ln ⁡ p ( X ∣ π , μ , Σ ) + λ ( ∑ j = 1 k π j − 1 ) \ln p(X|\pi, \mu, \Sigma) + \lambda(\sum_{j=1}^k \pi_j - 1) lnp(Xπ,μ,Σ)+λ(j=1kπj1)
π j \pi_j πj 求导,令导数为0:
∂ ln ⁡ p ( X ∣ π , μ , Σ ) + λ ( ∑ j = 1 k π j − 1 ) ∂ π j = ∑ i = 1 n p ( x i ∣ μ j , Σ j ) ∑ l = 1 k π l p ( x i ∣ μ l , Σ l ) + λ = 0 \frac {\partial \ln p(X|\pi, \mu, \Sigma) + \lambda(\displaystyle\sum_{j=1}^k \pi_j - 1)} {\partial \pi_j} =\sum_{i=1}^n \frac{p(x_i| \mu_j, \Sigma_j)}{\displaystyle\sum_{l=1}^k \pi_l p(x_i| \mu_l, \Sigma_l)} + \lambda = 0 πjlnp(Xπ,μ,Σ)+λ(j=1kπj1)=i=1nl=1kπlp(xiμl,Σl)p(xiμj,Σj)+λ=0
同乘 π j \pi_j πj 并将 j ∈ { 1 , 2 , . . . , k } j \in \{1,2,...,k\} j{1,2,...,k} 代入相加得:
∑ j = 1 k π j ∑ i = 1 n p ( x i ∣ μ j , Σ j ) ∑ l = 1 k π l p ( x i ∣ μ l , Σ l ) + λ ∑ j = 1 k π j = 0 \sum_{j=1}^k \pi_j\sum_{i=1}^n \frac{p(x_i| \mu_j, \Sigma_j)}{\displaystyle\sum_{l=1}^k \pi_l p(x_i| \mu_l, \Sigma_l)} + \lambda\sum_{j=1}^k \pi_j = 0 j=1kπji=1nl=1kπlp(xiμl,Σl)p(xiμj,Σj)+λj=1kπj=0
将约束条件代入:
∑ i = 1 n ( ∑ j = 1 k π j p ( x i ∣ μ j , Σ j ) ∑ l = 1 k π l p ( x i ∣ μ l , Σ l ) ) + λ ∑ j = 1 k π j = n + λ = 0 \sum_{i=1}^n (\frac{\displaystyle\sum_{j=1}^k \pi_j p(x_i| \mu_j, \Sigma_j)}{\displaystyle\sum_{l=1}^k \pi_l p(x_i| \mu_l, \Sigma_l)}) + \lambda\sum_{j=1}^k \pi_j = n + \lambda = 0 i=1n(l=1kπlp(xiμl,Σl)j=1kπjp(xiμj,Σj))+λj=1kπj=n+λ=0
λ = − n \lambda = -n λ=n,代入 ∑ i = 1 n p ( x i ∣ μ j , Σ j ) ∑ l = 1 k π l p ( x i ∣ μ l , Σ l ) + λ = 0 \displaystyle\sum_{i=1}^n \frac{p(x_i| \mu_j, \Sigma_j)}{\displaystyle\sum_{l=1}^k \pi_l p(x_i| \mu_l, \Sigma_l)} + \lambda = 0 i=1nl=1kπlp(xiμl,Σl)p(xiμj,Σj)+λ=0 中,得
π j = n j n \pi_j = \frac {n_j}{n} πj=nnj

GMM算法过程如下:

  1. 随机初始化参数 π i , μ i , Σ i , i ∈ { 1 , 2 , . . . , k } \pi_i, \mu_i, \Sigma_i,\ \ i\in \{1,2, ... ,k\} πi,μi,Σi,  i{1,2,...,k}

  2. E步:根据式 γ ( z j ) = π j p ( x i ∣ μ j , Σ j ) ∑ l = 1 k π l p ( x i ∣ μ l , Σ j ) \gamma(z_j)= \frac{\pi_jp(x_i|\mu_j, \Sigma_j)}{\sum\limits_{l=1}^k\pi_lp({x_i}|{\mu_l}, \Sigma_j)} γ(zj)=l=1kπlp(xiμl,Σj)πjp(xiμj,Σj) 计算每个样本由各个混合高斯成分生成的后验概率

  3. M步:用下式更新参数 π i , μ i , Σ i , i ∈ { 1 , 2 , . . . , k } \pi_i, \mu_i, \Sigma_i,\ \ i\in \{1,2, ... ,k\} πi,μi,Σi,  i{1,2,...,k}
    π j = n j n μ j = 1 n j ∑ i = 1 n γ ( z i j ) x i Σ j = ∑ i = 1 n γ ( z i j ) ( x i − μ j ) ( x i − μ j ) T n j \pi_j = \frac {n_j}{n}\\ \mu_j = \frac 1 {n_j}\sum_{i=1}^n\gamma(z_{ij})x_i\\ \Sigma_j = \frac {\displaystyle\sum_{i=1}^n\gamma(z_{ij})(x_i -\mu_j)(x_i -\mu_j)^T} {n_j} πj=nnjμj=nj1i=1nγ(zij)xiΣj=nji=1nγ(zij)(xiμj)(xiμj)T

  4. 如果参数值不再发生变化,根据 j = arg ⁡ max ⁡ j γ ( z j ) j=\arg\displaystyle\max_j \gamma(z_j) j=argjmaxγ(zj) 计算标签 j j j,否则,返回第2步

E步实现:

def e_step(x, mu_list, sigma_list, pi_list):"""e步,求每个样本由各个混合高斯成分生成的后验概率"""k = mu_list.shape[0]gamma_z = np.zeros((x.shape[0], k))for i in range(x.shape[0]):pi_times_pdf_sum = 0pi_times_pdf = np.zeros(k)for j in range(k):pi_times_pdf[j] = pi_list[j] * multivariate_normal.pdf(x[i], mean=mu_list[j], cov=sigma_list[j])pi_times_pdf_sum += pi_times_pdf[j]for j in range(k):gamma_z[i, j] = pi_times_pdf[j] / pi_times_pdf_sum

m步实现:

def m_step(x, mu_list, gamma_z):"""m步,根据公式更新参数"""k = mu_list.shape[0]n = x.shape[0]dim = x.shape[1]mu_list_new = np.zeros(mu_list.shape)sigma_list_new = np.zeros((k, dim, dim))pi_list_new = np.zeros(k)for j in range(k):n_j = np.sum(gamma_z[:, j])pi_list_new[j] = n_j / n # 计算新的pigamma = gamma_z[:, j]gamma = gamma.reshape(n, 1)mu_list_new[j, :] = (gamma.T @ x) / n_j # 计算新的musigma_list_new[j] = ((x - mu_list[j]).T @ np.multiply((x - mu_list[j]), gamma)) / n_j # 计算新的sigmareturn mu_list_new, sigma_list_new, pi_list_new

GMM主算法:

while True:gamma_z = e_step(x, mu_list, sigma_list, pi_list)mu_list, sigma_list, pi_list = m_step(x, mu_list, gamma_z)new_log_l = log_likelihood(x, mu_list, sigma_list, pi_list)if (old_log_l - new_log_l) < epsilon:break

4 实验结果与分析

4.1 k=3,各分布距离较远

生成k=3的2维数据测试K-Means和GMM的效果,各高斯分布的均值和协方差矩阵均不同。

各高斯分布的均值:[[ 2 6] [ 8 10] [ 8 2]]

在这里插入图片描述

4.1.1 K-means

下图的各中心坐标:[[ 8.01793576 1.79108972] [ 8.03150573 10.1021806 ] [ 2.24065269 5.92428314]]
在这里插入图片描述

下图的各中心坐标:[[ 8.0836514 10.09409582] [ 2.13241573 6.07466331] [ 7.90305055 1.85080409]]
在这里插入图片描述

下图的各中心坐标:[[ 7.90305055 1.85080409] [ 2.13241573 6.07466331] [ 8.0836514 10.09409582]]
在这里插入图片描述

从图中可以看出,随着精度的增大,准确率都在0.98,变化不大,但精度从1变为1e-5时,求得的聚类中心准确度增大了。

4.1.2 GMM

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可以看出,在本条件下,GMM得到的结果要比K-means得到的结果好一些。分类结果都在0.993以上,随精度的变化不大,所以推断它已经收敛到了一定程度,甚至各参数不再发生变化,再看各次运行时的最大似然对数,发现最大似然对数确实在增大,而大约从第30次迭代开始,就不再发生变化了,这也就解释了为什么在这些精度下不随精度的增大而变化。

4.2 k=5,各分布距离较近

生成k=5的2维数据测试K-Means和GMM的效果,各高斯分布的均值和协方差矩阵均不同。

各高斯分布的均值:[[2 2] [2 8] [5 5] [8 2] [8 8]]

在这里插入图片描述

4.2.1 K-means

下图的各中心坐标:[[1.81126365 1.70455608] [7.98534324 1.60414057] [4.68148749 4.42232503] [7.92856289 7.40125028] [2.31526297 7.84828289]]
在这里插入图片描述

下图的各中心坐标:[[8.06352571 1.74963954] [7.95994276 7.75805996] [1.86714372 7.97501538] [5.08440337 5.18070716] [2.03251864 1.8425656 ]]
在这里插入图片描述

下图的各中心坐标:[[1.86714372 7.97501538] [8.06352571 1.74963954] [7.95994276 7.75805996] [5.08440337 5.18070716] [2.03251864 1.8425656 ]]
在这里插入图片描述

4.2.2 GMM

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可以看出在精度较低时,GMM的效果并不好,但提高精度后,准确率和大幅度提升,最后比K-means的分类效果要好一点。

4.3 UCI数据集

在这里插入图片描述
在这里插入图片描述

5 结论

K-Means实际上假设数据式呈球状分布,假设使用的欧式距离来衡量样本与各个簇中心的相似度(假设数据的各个维度对于相似度计算的作用是相同的),它的簇中心初始化对于最终的结果有很大的影响,如果选择不好初始的簇中心值容易使之陷入局部最优解;与之相比GMM使用更加一般的数据表示即高斯分布,GMM使用EM算法进行迭代优化,因为其涉及到隐变量的问题,没有之前的完全数据,而是在不完全数据上进行。

K-Means其实就是一种特殊的高斯混合模型,假设每种类在样本中出现的概率相等均为 1 k \frac 1 k k1 , 而且假设高斯模型中的每个变量之间是独立的,即变量间的协方差矩阵是对角阵,这样我们可以直接用欧氏距离作为K-Means的协方差去衡量相似性;K-Means对响应度也做了简化,每个样本只属于一个类,即每个样本属于某个类响应度为1,对于不属于的类响应度设为0,算是对GMM的一种简化。而在高斯混合模型中,每个类的数据出现在样本中的概率为,用协方差矩阵替代K-Means中的欧式距离去度量点和点之间的相似度,响应度也由离散的0,1变成了需要通过全概率公式计算的值。由于GMM不像K-means做了很多假设,所以分类最终效果比K-Means好,但是GMM-EM算法过于细化,容易被噪声影响,所以适合对K-Means的分类结果进行进一步优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/47060.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SwiftUI——提供多种小组件(Widget)供用户选择

有时候app需要提供多种widget供用户选择/使用&#xff0c;那么可以使用以下方法&#xff0c;不过需要注意&#xff0c;每个app最多可以包含5种小组件&#xff08;Widget&#xff09;&#xff1a; 首先做几个小组件&#xff1a; //省略之前的Provider和SimpleEntey部分 //第一个…

iOS轻量级组件化管理工具,让你轻轻松松添加自己的小组件.

2019独角兽企业重金招聘Python工程师标准>>> TXRouter 轻量级组件化管理工具,让你轻轻松松添加自己的小组件.该工具原理简单、制作轻松、思路清晰等优点. TXRouter优点 比MGJRouter更加简单、使用更加方便原理简单、制作轻松、思路清晰 TXModel缺点 不能高大上定义U…

iOS14 Widget小组件开发实践1——了解Widget

iOS14带来了新的UI组件&#xff1a;WidgetKit&#xff0c;人称小组件&#xff08;用过安卓的都能理解&#xff09;&#xff0c;这货的前身其实就是iOS10时候引入的Today Extension。 Widget为应用程序提供了这样一种功能&#xff1a;其可以让用户在主屏幕上展示App中用户所关心…

如何用iOS14 Widget小组件自定义玩法

一.了解Widget iOS14带来了新的UI组件:WidgetKit,人称小组件(用过安卓的都能理解),这货的前身其实就是iOS10时候引入的Today Extension。 Widget为应用程序提供了这样一种功能:其可以让用户在主屏幕上展示App中用户所关心的信息。例如一款天气软件,其可以附带一个Widg…

iOS14 Widget开发踩坑(二)修正版-多个小组件

iOS14 Widget开发踩坑&#xff08;二&#xff09;修正版-多个小组件 前言添加多个小组件情况1.对于已经写好的一个小组件情况2.对于新建好还没写的小组件 Widgets的限制突破小组件个数限制的方法参考文献 前言 2020年12月3日 经过进一步的学习 发现了文章中还有很多错误&#…

IOS小组件(1):概述

IOS小组件(1):概述 引言小组件是什么?小组件概述小组件开发备注小组件实现原理结语引言 本系列文章作者是安卓开发,以安卓开发的视角学习IOS小组件,记录一下踩坑记录,如有讲得不对的地方,路过大佬多包涵。如果你是想深入学习小组件,建议您顺着笔者的编号顺序阅读本系列…

ios中在app应用内刷新小组件数据

需求&#xff1a; 我们需要在app应用内刷新时间线&#xff0c;让桌面小组件加载最新的内容。即app内修改了共享数据后&#xff0c;需要通知桌面小组件强制刷新&#xff0c;显示改变后的内容。 当某种情况影响到小组件的当前时间线时&#xff0c;您的 App 可以指示 WidgetKit …

android 仿苹果 小组件,仿ios14桌面小部件

仿ios14桌面小部件&#xff0c;这是一款面向广大安卓手机用户推出的高仿iOS14桌面插件软件&#xff0c;大家可以使用这款软件快速完成自己想要的桌面显示&#xff0c;多种插件一键点击轻松完成设置过程&#xff0c;让大家体验到同款iOS14桌面强大的功能&#xff0c;非常有意思的…

iOS14 小组件 开发1

前言:小组件的开发和我们正常情况开发App的逻辑是一样的,正常情况分为:网络请求,数据模型,view,渲染.只不过是小组件的开发使用了 swiftUI 语言来编写,所以要对SwiftUI的空间有所了解. 好!那我们接下来开始我们的小组件开发吧. 首先,创建Widget Extension 然后选择证书,起个名…

Android-为应用添加widget小组件

最近在实现为应用程序添加小组件的功能&#xff0c;记录一下开发过程。 1.添加一个小组件模板 设置组件类名称&#xff0c;其他属性按需求设置&#xff0c;这些属性在生成的文件中也可修改 ​​​​​​ 工程main目录下会生成类文件&#xff0c;res目录下生成资源文件&#x…

iOS 15 新增多个实用小组件

iOS 14 上线加入的桌面小组件功能非常受欢迎&#xff0c;因此苹果iOS 15新系统对小组件功能进行深度优化&#xff0c;并加入了多个实用又有趣的小组件。用户可以简单通过上下滑动来选择、重新排列、智能堆栈小组件&#xff0c;也可以对它们进行删除、智能旋转&#xff0c;还可以…

Widget小组件

目录 技能点 Widget背调 a. 设计定位 b. Widget小组件限制 c. Widget小组件 开发须知 d. 什么是 SwiftUI App Group 数据共享 a. 配置 App Groups 1、开发者账号配置&#xff0c;并更新pp证书 2、Xcode配置 b. 缓存数据共享-代码实现 1、文件存储 2. 沙盒存储&…

iOS_小组件widget基本功能

创建 在当前工程里新建target 选择Today Extension 独立应用 widget虽做为应用的扩展, 但却是两个完全独立的应用 widget上线需要单独申请 AppID 和 Bundle Identifier , 需要配置 证书 和 Provisioning Profiles(配置文件) 第三方pod导入, 也的重新导入一份 target MMWidg…

iOS 14-Widget小组件2—实现

Widget 实现 认识与配置实现效果图支持显示方式交互数据共享刷新策略网络加载屏幕适配支持多个小部件布局例子源码其他问题参考认识与配置 上一篇文章已经做了比较详细的介绍与创建配置iOS 14-Widget小组件1—初识 实现效果图 支持显示方式 @main 入口添加.supportedFamilie…

自定义开发苹果手机显示汽车小组件

实时获取汽车数据信息实时获取汽车定位信息&#xff08;点击地址进入高德&#xff09;显示当前位置的天气情况可定制显示当前城市是否限行可定制当前城市油价信息实时刷新最新数据 感兴趣的可以私聊加群

iOS 小组件 widget

苹果官网文档&#xff08;apple developer&#xff09;widgetkit 文章目录 1.创建小组件2.编辑小组件3.数据共享4.拖动排序5.参考链接 1.创建小组件 File -> New -> Target 搜索widget,点击next 勾上Include Configuration Intent, 表示需要编辑小组件&#xff0c;点击f…

iOS 小组件 widget 编辑小组件

返回小组件专栏&#xff1a;iOS 小组件 widget 文章目录 1.编辑小组件2.intentHandler 1.编辑小组件 如下图&#xff0c;编辑小组件&#xff0c;需要在GirlWidget.intentdefinition中配置 点击右下角的加号&#xff0c;新建一个枚举类型 枚举类型改名MyEnum,并添加三个值 …

iOS 小组件开发

iOS14之后Apple引入了新的WidgetKit&#xff0c;舍弃了原有额TodayExtension。 开发准备&#xff1a; 新的WidgetExtension只能通过SwiftUI进行开发&#xff1b; Widget有三种尺寸&#xff1a;systemSmall、 systemMedium、systemLarge&#xff0c;三种尺寸对应固定的UI类型布…

iOS 小组件 widget group id, app group, 数据共享

返回小组件专栏&#xff1a;iOS 小组件 widget 主APP, 小组件&#xff0c; 小组件的intent是三个独立的target, 需要有三个bundle id和对应的配置文件。而且他们的bundle identifier是从属关系。小组件的bundle id必须以主app的bundle id作为前缀。比如主app的为“com.test”&a…

演讲实录:指标平台+AI 的技术落地和未来展望

7月14日&#xff0c;以“释放数智生产力”为主题的 Kyligence 用户大会在上海成功举行。大会现场发布了 Kyligence 最新产品家族&#xff1a;AI 数智助理——Kyligence Copilot 的预览版、一站式指标平台 Kyligence Zen 的 Cloud 和 Enterprise 版本&#xff0c;以及企业级 OLA…