【统计学习方法】EM算法实现之隐马尔科夫模型HMM

1 基本概念

1.1 马尔科夫链(维基百科)

马尔可夫链(英语:Markov chain),又称离散时间马尔可夫链(discrete-time Markov chain,缩写为DTMC),因俄国数学家安德烈·马尔可夫得名,为状态空间中经过从一个状态到另一个状态的转换的随机过程。该过程要求具备“无记忆”的性质:下一状态的概率分布只能由当前状态决定,在时间序列中它前面的事件均与之无关。这种特定类型的“无记忆性”称作马尔可夫性质。

1.2 马尔科夫过程——离散的叫马尔科夫链

在概率论及统计学中,马尔可夫过程(英语:Markov process)是一个具备了马尔可夫性质的随机过程,因为俄国数学家安德雷·马尔可夫得名。马尔可夫过程是不具备记忆特质的(memorylessness)。换言之,马尔可夫过程的条件概率仅仅与系统的当前状态相关,而与它的过去历史或未来状态,都是独立、不相关的。

具备离散状态的马尔可夫过程,通常被称为马尔可夫链。马尔可夫链通常使用离散的时间集合定义,又称离散时间马尔可夫链。有些学者虽然采用这个术语,但允许时间可以取连续的值。

1.3 隐马尔科夫模型定义

隐马尔可夫模型(Hidden Markov Model;缩写:HMM)或称作隐性马尔可夫模型,是统计模型,它用来描述一个含有隐含未知参数的马尔可夫过程。其难点是从可观察的参数中确定该过程的隐含参数。然后利用这些参数来作进一步的分析,例如模式识别。

在正常的马尔可夫模型中,状态对于观察者来说是直接可见的。这样状态的转换概率便是全部的参数。而在隐马尔可夫模型中,状态并不是直接可见的,但受状态影响的某些变量则是可见的。每一个状态在可能输出的符号上都有一概率分布。因此输出符号的序列能够透露出状态序列的一些信息。

隐马尔科夫模型是关于时序的概率模型,描述一个由隐藏的马尔科夫链随机生成不可观测的状态随机序列,再由各个状态生成一个可观测的观测随机序列的过程。

1.4 隐马尔科夫模型参数的确定

1.4.1 初始概率分布\pi

 i_1可能是状态1,状态2 ... 状态n,于是i_1就有个N点分布:

i_1状态1状态2...状态n
概率P_1P_2..P_n

即:i_1对应个n维的向量。

上面这个n维的向量就是初始概率分布,记做π。

1.4.2 状态转移矩阵A

因为i_2i_1不独立,所以i_2是状态1的概率有:i_1是状态1时i_2是状态1,i_1是状态2时i_2是状态1,..., i_1是状态n时i_2是状态1,如下表

i_2\i_1状态1状态2...状态n
状态1P11P12...P1n
状态2P21P22...P2n
...............
状态nPn1Pn2...Pnn

即:i_1->i_2对应n*n的矩阵。

同理:i_n -> i_{n+1}对应个n*n的矩阵。

上面这些n*n的矩阵被称为状态转移矩阵,用An*n表示。

      当然了,真要说的话,i_n -> i_{n+1}的状态转移矩阵一定都不一样,但在实际应用中一般将这些状态转移矩阵定为同一个,即:只有一个状态转移矩阵。

1.4.3 观测矩阵B

  如果对于i_n有:状态1, 状态2, ..., 状态n,那i_n的每一个状态都会从下面的m个观测中产生一个:观测1, 观测2, ..., 观测m,所以有如下矩阵:

i_n\O_m观测1观测2...观测m
状态1P11P12...P1m
状态2P21P22...P2m
...............
状态nPn1Pn2...Pnm

这可以用一个n*m的矩阵表示,也就是观测矩阵,记做Bn*m。

由于HMM用上面的π,A,B就可以描述了,于是我们就可以说:HMM由初始概率分布π、状态转移概率分布A以及观测概率分布B确定,为了方便表达,把A, B, π 用 λ 表示,即:

            λ = (A, B, π)

2 隐马尔科夫模型

隐马尔科夫模型是一个生成模型,也就意味着一旦掌握了其底层结构,就可以产生数据。

HMM模型一共有三个经典的问题需要解决:

    1) 评估观察序列概率。即给定模型\lambda (A,B,\pi)和观测序列O(O_1,O_2,O_3...O_T),计算在模型λ下观测序列𝑂出现的概率P(O|\lambda)。这个问题的求解需要用到前向后向算法,我们在这个系列的第二篇会详细讲解。这个问题是HMM模型三个问题中最简单的。

    2)模型参数学习问题。即给定观测序列O(O_1,O_2,O_3...O_T),估计模型\lambda (A,B,\pi)的参数,使该模型下观测序列的条件概率P(O|\lambda)最大。这个问题的求解需要用到基于EM算法的鲍姆-韦尔奇算法, 我们在这个系列的第三篇会详细讲解。这个问题是HMM模型三个问题中最复杂的。

    3)预测问题,也称为解码问题。即给定模型\lambda (A,B,\pi)和观测序列O(O_1,O_2,O_3...O_T),求对给定观测序列条件概率P(I|O)最大的状态序列 I(i_1,i_2,i_3...i_T)。即给定观测序列条件下,最可能出现的对应的状态序列,这个问题的求解需要用到基于动态规划的维特比算法,我们在这个系列的第四篇会详细讲解。这个问题是HMM模型三个问题中复杂度居中的算法。

2.1 概率计算问题

穷举算法,有N中状态,经过T时间,则有N^{T}种可能(因为每一种状态都可能观测到O_{t}),计算量巨大。但是很多路径是重复,基于动态规划的知识,我们可以重复利用很多节点的计算结果,所以出来了前向算法和后向算法。

2.1.1 前向概率

给定隐马尔可夫模型\lambda (A,B,\pi),定义到时刻t为止的观测序列为O(O_1,O_2,O_3...O_T),且状态为的概率为前向概率,记作:

a_t(i) = P(O_1,O_2,O_3...O_t,i_t=q_i|\lambda)

可以递推地求得前向概率a_t(i)及观测序列概率P(O|\lambda)

定义解析:由于每个状态生成一个观测变量,那么在t时刻就会生成t个观测变量,在t时刻处于状态i的概率就是前向概率。

2.1.1 前向算法

算法的目的:根据初始参数观测序列求出观测序列概率

前向概率的定义是:当第t个时刻的状态为i时,前面的时刻分别观测到O_1,O_2,O_3...O_T的概率,即:

\alpha_i(t) = P(O_1,O_2,O_3...O_t|q_t=i,\lambda)

从上图可以看出,我们可以基于时刻t时各个隐藏状态的前向概率,再乘以对应的状态转移概率,即a_t(j)a_{ji}就是在时刻t观测到O(O_1,O_2,O_3...O_T),并且时刻t隐藏状态q_j, 时刻t+1隐藏状态q_i的概率。如果将像上面所有的线对应的概率求和,即\sum_{j=1}^{N}a_t(j)a_{ji}就是在时刻t观测到O(O_1,O_2,O_3...O_T),并且时刻t+1隐藏状态q_i的概率。继续一步,由于观测状态O_{t+1}只依赖于t+1时刻隐藏状态q_i, 这样\left [ \sum_{j=1}^{N}a_t(j)a_{ji} \right ]b_i(O_{t+1})就是在在时刻t+1观测到O(O_1,O_2,O_3...O_T,O_{T+1}),并且时刻t+1隐藏状态q_i的概率。而这个概率,恰恰就是时刻t+1对应的隐藏状态i的前向概率,这样我们得到了前向概率的递推关系式如下:

a_{t+1}(i) = \left [ \sum_{j=1}^{N} a_t(j)a_{ji}\right ]b_i(o_{t+1})

前向算法步骤:

输入:HMM模型\lambda (A,B,\pi),观测序列O(O_1,O_2,O_3...O_T)

输出:观测序列概率𝑃(𝑂|𝜆)

1) 计算时刻1的各个隐藏状态前向概率:

\alpha_1(i) = \pi_i b_i(O_1),i=1,2...N

2) 递推时刻2,3,...𝑇2,3,...T时刻的前向概率:

a_{t+1}(i) = \left [ \sum_{j=1}^{N} a_t(j)a_{ji} \right ]b_i(o_{t+1}),i=1,2...N

3) 计算最终结果:

P(O|\lambda) = \sum_{i=1}^{N}a_T(i)

PS:这里的 a_i(t)中i表示第i号状态,t表示第t时刻。有的教程中会把i和t位置调换一下,变成 a_t(i),其实都一样。

代码实现:

def forward(obs_seq):"""前向算法"""N = A.shape[0]T = len(obs_seq)# F保存前向概率矩阵F = np.zeros((N,T))F[:,0] = pi * B[:, obs_seq[0]]  # 初始状态输出序列元素0概率for t in range(1, T):for n in range(N):# t时刻各个状态,是t-1时刻各个状态转移过来的# A[:,n]表示各个状态转移到状态n# F[:,t-1]表示从初始时刻到t-1处于该状态的概率(不准确的理解)# B[n, obs_seq[t]]表示n状态输出obs_seq[t]观察值的概率# 利用点乘 累加 所有状态F[n,t] = np.dot(F[:,t-1], (A[:,n])) * B[n, obs_seq[t]]return F

2.1.2 后向算法

 后向算法和前向算法非常类似,都是用的动态规划,唯一的区别是选择的局部状态不同,后向算法用的是“后向概率”。

 后向概率的定义是:当第t个时刻的状态为i时,后面的时刻分别观测到O_{t+1},O_{t+2},O_{t+3}...O_T的概率,即:

\beta_i(t) = P(O_{t+1},O_{t+2},O_{t+3.}..O_T|q_t=i,\lambda)

后向概率的动态规划递推公式和前向概率是相反的。现在我们假设我们已经找到了在时刻t+1时各个隐藏状态的后向概率\beta_{t+1}(j),现在我们需要递推出时刻t时各个隐藏状态的后向概率。如下图,我们可以计算出观测状态的序列为O_{t+1},O_{t+2},O_{t+3}...O_T, t时隐藏状态q_i, 时刻t+1隐藏状态为q_j的概率为a_{ij}\beta_{t+1}(j), 接着可以得到观测状态的序列为O_{t+1},O_{t+2},O_{t+3}...O_T, t时隐藏状态为q_i, 时刻t+1隐藏状态为q_j的概率为a{ij}b{j}(O_{t+1})\beta_{t+1}(j), 则把下面所有线对应的概率加起来,我们可以得到观测状态的序列为O_{t+1},O_{t+2},O_{t+3}...O_T, t时隐藏状态为q_i的概率为\sum _{j=1}^{N}a_{ij}b_j(O_{t+1})\beta_{t+1}(j),这个概率即为时刻t的后向概率。

这样我们得到了后向概率的递推关系式如下:

\beta_t (i)=\sum_{j=1}^{N}a_{ij}b_j(O_{t+1})\beta_{t+1}(j)

后向算法步骤:

代码实现:


def backward(obs_seq):"""后向算法"""N = A.shape[0]T = len(obs_seq)# X保存后向概率矩阵X = np.zeros((N,T))#t=T,T+1已经不观察了,后向概率都为1X[:,-1:] = 1for t in reversed(range(T-1)):for n in range(N):#t时刻转移概率*(t+1)时刻的后向概率X[n,t] = np.sum(X[:,t+1] * A[n,:] * B[:, obs_seq[t+1]])return X

2.3 学习问题

Baum-Welch算法也就是EM算法,己知观测序列O(O_1,O_2,O_3...O_T),估计模型参数\lambda (A,B,\pi),使得在该模型下观测序列概率P(O|\lambda)最大。即用极大似然估计的方法估计参数。

2.4 预测问题(viterbi算法

参考视频:https://www.youtube.com/watch?v=RKDIpPyeTTk

参考文章:如何通俗地讲解 viterbi 算法? - 知乎

删掉了不可能是答案的路径,就是viterbi算法(维特比算法)的重点,因为后面我们再也不用考虑这些被删掉的路径了

代码实现:

    def viterbi(self, obs_seq):"""Returns-------V : numpy.ndarrayV [s][t] = Maximum probability of an observation sequence endingat time 't' with final state 's'观察序列prev : numpy.ndarrayContains a pointer to the previous state at t-1 that maximizesV[state][t]"""N = self.A.shape[0]T = len(obs_seq)prev = np.zeros((T - 1, N), dtype=int)# DP matrix containing max likelihood of state at a given time# 隐状态个数, 观测序列长度V = np.zeros((N, T))# 0时刻观测状态 =  状态初始概率 * 每个状态输出观测概率V[:,0] = self.pi * self.B[:,obs_seq[0]]for t in range(1, T):for n in range(N):# 上一时刻状态概率 * 状态转移概率(每一个状态转移到状态n) * 观察概率seq_probs = V[:,t-1] * self.A[:,n] * self.B[n, obs_seq[t]]# prev用于记录最大概率是从哪个状态转移过来的 -- >记录转移路径prev[t-1,n] = np.argmax(seq_probs)# 这里找出概率当前状态最大的概率,实质就是删除不可能的路径 --> 记录最大概率V[n,t] = np.max(seq_probs)return V, prev

3 代码实现

完整实现

import numpy as npclass HMM:"""Order 1 Hidden Markov ModelAttributes----------A : numpy.ndarrayState transition probability matrixB: numpy.ndarrayOutput emission probability matrix with shape(N, number of output types)pi: numpy.ndarrayInitial state probablity vectorCommon Variables----------------obs_seq : list of intlist of observations (represented as ints corresponding to outputindexes in B) in order of appearanceT : intnumber of observations in an observation sequenceN : intnumber of states"""def __init__(self, A, B, pi):self.A = Aself.B = Bself.pi = pidef _forward(self, obs_seq):N = self.A.shape[0]T = len(obs_seq)F = np.zeros((N,T))F[:,0] = self.pi * self.B[:, obs_seq[0]]for t in range(1, T):for n in range(N):F[n,t] = np.dot(F[:,t-1], (self.A[:,n])) * self.B[n, obs_seq[t]]return Fdef _backward(self, obs_seq):N = self.A.shape[0]T = len(obs_seq)X = np.zeros((N,T))X[:,-1:] = 1for t in reversed(range(T-1)):for n in range(N):X[n,t] = np.sum(X[:,t+1] * self.A[n,:] * self.B[:, obs_seq[t+1]])return Xdef observation_prob(self, obs_seq):""" P( entire observation sequence | A, B, pi ) """return np.sum(self._forward(obs_seq)[:,-1])def state_path(self, obs_seq):"""Returns-------V[last_state, -1] : floatProbability of the optimal state pathpath : list(int)Optimal state path for the observation sequence"""V, prev = self.viterbi(obs_seq)# Build state path with greatest probabilitylast_state = np.argmax(V[:,-1])path = list(self.build_viterbi_path(prev, last_state))return V[last_state,-1], reversed(path)def viterbi(self, obs_seq):"""Returns-------V : numpy.ndarrayV [s][t] = Maximum probability of an observation sequence endingat time 't' with final state 's'prev : numpy.ndarrayContains a pointer to the previous state at t-1 that maximizesV[state][t]"""N = self.A.shape[0]T = len(obs_seq)prev = np.zeros((T - 1, N), dtype=int)# DP matrix containing max likelihood of state at a given timeV = np.zeros((N, T))V[:,0] = self.pi * self.B[:,obs_seq[0]]for t in range(1, T):for n in range(N):seq_probs = V[:,t-1] * self.A[:,n] * self.B[n, obs_seq[t]]prev[t-1,n] = np.argmax(seq_probs)V[n,t] = np.max(seq_probs)return V, prevdef build_viterbi_path(self, prev, last_state):"""Returns a state path ending in last_state in reverse order."""T = len(prev)yield(last_state)for i in range(T-1, -1, -1):yield(prev[i, last_state])last_state = prev[i, last_state]def baum_welch_train(self, obs_seq):N = self.A.shape[0]T = len(obs_seq)forw = self._forward(obs_seq)back = self._backward(obs_seq)# P( entire observation sequence | A, B, pi )obs_prob = np.sum(forw[:,-1])if obs_prob <= 0:raise ValueError("P(O | lambda) = 0. Cannot optimize!")xi = np.zeros((T-1, N, N))for t in range(xi.shape[0]):xi[t,:,:] = self.A * forw[:,[t]] * self.B[:,obs_seq[t+1]] * back[:, t+1] / obs_probgamma = forw * back / obs_prob# Gamma sum excluding last columngamma_sum_A = np.sum(gamma[:,:-1], axis=1, keepdims=True)# Vector of binary values indicating whether a row in gamma_sum is 0.# If a gamma_sum row is 0, save old rows on updaterows_to_keep_A =  (gamma_sum_A == 0)# Convert all 0s to 1s to avoid division by zerogamma_sum_A[gamma_sum_A == 0] = 1.next_A = np.sum(xi, axis=0) / gamma_sum_Agamma_sum_B = np.sum(gamma, axis=1, keepdims=True)rows_to_keep_B = (gamma_sum_B == 0)gamma_sum_B[gamma_sum_B == 0] = 1.obs_mat = np.zeros((T, self.B.shape[1]))obs_mat[range(T),obs_seq] = 1next_B = np.dot(gamma, obs_mat) / gamma_sum_B# Update modelself.A = self.A * rows_to_keep_A + next_Aself.B = self.B * rows_to_keep_B + next_Bself.pi = gamma[:,0] / np.sum(gamma[:,0])

参考:

隐马尔可夫(HMM)、前/后向算法、Viterbi算法

【火炉炼AI】机器学习044-创建隐马尔科夫模型

隐马尔可夫模型HMM及Python实现

隐马尔可夫模型之Baum-Welch算法详解

HMM超详细讲解+代码

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

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

相关文章

NLP --- 隐马尔可夫HMM(EM算法(期望最大化算法))

期望最大化 (Expectation Maximization) 算法最初是由 Ceppellini[2] 等人 1950 年在讨论基因频率的估计的时候提出的。后来又被 Hartley[3] 和Baum[4] 等人发展的更加广泛。目前引用的较多的是 1977 年 Dempster[5]等人的工作。它主要用于从不完整的数据中计算最大似然估计。后…

Python用MCMC马尔科夫链蒙特卡洛、拒绝抽样和Metropolis-Hastings采样算法

最近我们被客户要求撰写关于MCMC的研究报告&#xff0c;包括一些图形和统计输出。 我们将研究两种对分布进行抽样的方法&#xff1a;拒绝抽样和使用 Metropolis Hastings 算法的马尔可夫链蒙特卡洛方法 (MCMC)。像往常一样&#xff0c;我将提供直观的解释、理论和一些带有代码…

机器学习笔记马尔可夫链蒙特卡洛方法(二)马尔可夫链与平稳分布

机器学习笔记之马尔可夫链蒙特卡洛方法——马尔可夫链与平稳分布 引言回顾&#xff1a;蒙特卡洛方法马尔可夫链与平稳分布马尔可夫链平稳分布细致平衡 关于平稳分布的补充马尔可夫链的本质平稳分布的收敛性证明 相关总结 引言 上一节介绍了蒙特卡洛方法的具体思想 以及一些具体…

大气模型软件:WRF、CMAQ、SMOKE、MCM、CAMx、Calpuff、人工智能气象、WRFchem、PMF、FLEXPART拉格朗日粒子扩散、WRF-UCM、EKMA

推荐给大家一些大气科学相关的模型软件&#xff0c;今天主要整理了一些需求量较高的&#xff0c;大家可以详细了解。零基础的可以点击此链接 >>零基础学习大气污染模式&#xff08;WRF、WRF-chem、smoke、camx等&#xff09; 目录 一、&#xff08;WRF-UCM&#xff09;…

毕业论文-马尔可夫随机场

0 序言 这篇博客也与我的毕业论文有关&#xff0c;在上个阶段中&#xff0c;我用python代码实现了EM算法&#xff0c;并及进行了细节上的改进&#xff0c;并记录成了博客&#xff1a; 毕业论文-EM算法学习总结https://blog.csdn.net/qq_41938259/article/details/128396229?s…

马尔科夫系列——三、隐马尔可夫模型 - 学习问题 - Baum-Welch算法

转载的过程中发现&#xff0c;原文有些地方不太理解&#xff0c;就阅读了其他的文章&#xff0c;然后把代码的实现也引进来了。之前并没有验证代码的准确性&#xff0c;后面有人说&#xff0c;代码可能有问题&#xff0c;我尝试了修改。把简单修改版本的也放上来。 目录 一、…

马尔可夫链蒙特卡洛(MCMC)在python中的实战案例应用

最近由于工作繁忙&#xff0c;博客更新较慢&#xff0c;所以请大家见谅&#xff01;pymc是一个做贝叶斯分析的python库&#xff0c;我之前的博客中已经介绍了pymc的使用方法&#xff0c;今天再给大家做个更详细的应用案例介绍。该案例来自于github&#xff0c;我将其代码稍微修…

马尔可夫蒙特卡洛(MCMC)附python代码

马尔可夫蒙特卡洛&#xff08;MCMC&#xff09; 1.马尔可夫链(Markov Chain) 随机过程是一组随机变量 X t X_t Xt​的集合&#xff0c; t t t为整数的时候&#xff0c;就是离散随机过程。马尔可夫过程是指一个满足马尔可夫性质的随机过程。马尔可夫性质是指: P ( X t 1 ∣ X…

隐马尔可夫模型在map-matching中的应用

该要 Map-matching是指将手机gps上报的轨迹点&#xff08;经纬度&#xff09;映射到路网上。由于精度问题&#xff0c;上报的轨迹点通常和实际位置有所偏差&#xff0c;因此产生了很多算法进行绑路&#xff0c;其中效果最好的是hmm&#xff08;隐马尔可夫模型&#xff09;的应…

隐马尔可夫模型HMM+维特比算法(Viterbi Algorithm)进行词性标注代码实现(自然语言处理课程第二次作业)

文章目录 一、理论描述二、算法描述三、详例描述具体过程分析题目数据预处理转移概率矩阵&#xff1a;发射概率矩阵&#xff1a; HMM维特比算法进行词性标注开始进行词性标注&#xff1a;The&#xff1a;bear&#xff1a;is&#xff1a;on&#xff1a;the&#xff1a;move&…

海尔计算机无法装win7系统,海尔Haier电脑预装win8换win7系统BIOS设置及安装教程

现在市场很多笔记本或一体机电脑都是预装win8或win8.1操作系统&#xff0c;但很多用户还是比较习惯使用Win7或xp操作系统&#xff0c;所以会在预装的win8系统上安装自己所习惯的操作系统&#xff0c;一般情况要更换预装的系统是要对BIOS进行设置的&#xff0c;在不同品牌的电脑…

海尔微型计算机硬盘如何拆卸,海尔a62的详细拆机步骤【图文教程】

随着社会的不断发展&#xff0c;台式电脑已经无法满足市场的需求了&#xff0c;现在 笔记本电脑 非常地流行&#xff0c;它以轻薄的机身和过高的配置赢得了很多顾客的喜爱&#xff0c;所以市场上也出现了各种品牌的笔记本电脑。大家知道吧&#xff0c;任何东西都是优势互补的&a…

海尔计算机无法装win7系统,海尔品牌机win10改win7系统教程

近期有朋友向小编反映说&#xff0c;最近想将海尔品牌机预装的win10系统改成win7的&#xff0c;但是每次ghost完系统后&#xff0c;总是启动不开&#xff0c;这是怎么回事呢&#xff1f;这一般是bios的设置不对&#xff0c;这里小编就来给大家介绍一下海尔品牌机怎么将win10改成…

海尔android 电视直播软件,海尔智能电视如何安装直播软件看直播

嗨&#xff0c;大家好&#xff0c;今天我来给大家简单介绍一下智能电视怎么安装第三方软件&#xff1f;买了智能电视&#xff0c;很多用户 都会发现它不能像传统电视一样去看直播电视。这个时候我们就需要去安装第三方软件去解决。 一般来说&#xff0c;在智能电视里面&#xf…

海尔微型计算机U盘启动,海尔台式电脑如何bios设置u盘启动教程

许多用户打算使用u盘给海尔台式电脑装系统&#xff0c;但在操作过程中发现不会设置u盘启动&#xff0c;其实只要了解清楚&#xff0c;掌握海尔台式电脑bios设置u盘为第一启动项的方法很是简单&#xff0c;今天快启动小编就为大家分享下详细操作教程把。 海尔台式电脑从u盘启动有…

海尔云悦2db微型计算机,家庭主机新选择 海尔云悦mini2首发评测

1海尔云悦mini2评测前言 虽然家用台式机的市场份额一直持续下滑,以至于业界很多人认为台式机已经退出历史舞台,被笔记本、一体电脑所代替。但是,笔者要在这里为台式机正音,台式机依然是很多用户的选择,并且台式机体积越来越小,功能越来越多。甚至,台式机开始进军客厅战场…

海尔电视android怎么设置,海尔电视怎么连接手机 海尔电视连接手机步骤

随着电视发展越来越迅速&#xff0c;电视的更新换代也是非常越来越快。而如今电视也变得越来越智能化了。它不但可以看电视&#xff0c;还可以连接网络&#xff0c;连接手机的。而电视行业品牌也是非常的多的。而对于电视老品牌 海尔 &#xff0c;它们的产品也是非常优秀的。并…

海尔电视 android,海尔电视遥控器

海尔电视遥控器手机版是一款多功能智能电视控制软件。海尔电视遥控器app支持多种手机品牌&#xff0c;通过与手机连接之后&#xff0c;手机就变成了遥控器&#xff0c;使用更方便&#xff01; 软件介绍 海尔电视遥控器app全面支持多品牌手机&#xff0c;没有网络也能轻松遥控电…

海尔电视 android,海尔电视怎么投屏

导言&#xff1a;你知道海尔电视怎么投屏吗&#xff1f; 摘要&#xff1a;海尔是当前国内非常受欢迎的品牌&#xff0c;在当下飞速发展的时代&#xff0c;海尔电视也与时俱进。现在的海尔电视不仅仅只限于观看&#xff0c;还可以连接手机&#xff0c;更可以电视投屏。那你知道海…

海尔微型台式计算机重装系统,海尔台式电脑bios设置u盘启动教程

海尔是全国知名品牌&#xff0c;相信用户朋友们多少都有点了解海尔这个老品牌&#xff0c;可是最近有用户想用u盘给海尔电脑重装系统,但是不知道海尔电脑bios设置u盘启动方法&#xff0c;其实海尔台式电脑bios设置启动项很简单,装机吧小编写了一份海尔台式机bios设置u盘启动的方…