就是训练数据无标签,算法自动对数据进行分类,听着很神奇,但学了机器学习以后,除了神经网络比较悬,对人像是个黑盒,别的都是基于数学的分类算法,无监督学习也不例外。
聚类—K-means算法
坐标轴上有一堆数据,要把他们当中更像的划分在一起,如何实现呢?这就是K-means
算法的思想,该算法通过如下步骤实现该功能:
1,随机猜测,随机选择两个或多个中心点,其他点根据到中心点的距离分配所属集群,此时就得到了按到中心点距离划分的多个集群;
2,移动中心,因为中心点随机划分,并不能代表集群都是相近的数据,对一个集群内的所有点求平均位置,将中心点移至该处;
3,重新计算集群归属,根据中心点现有位置重新确认数据点所属的集群;
4,重复2、3,直到中心点位置不发生变化。
图解过程大致如下:
详细说明如下:
随机选取k个中心点u1
、u2
、、、uk
;
分别计算距离最近的数据点,并归类为ci
评价聚类算法同样通过一个成本函数来实现,此处为失真函数,表示各数据点到中心点距离平方和的平均,数学定义如下:
聚类算法的目的在于最小化失真函数,即让中心点所属数据离中心点距离最短,该算法每次调整后失真函数应该下降或不变,若上升了则说明算法有bug。
中心点选取
首先是位置选取,由于选择中心点不同最后的分类也会不同,只能通过不断地尝试找到相对较小的分类方法并认定其为最佳,通常做法随机选取k个数据点作为中心,多次允许将不同集群的失真函数J作比较。
k的数量决定划分的种类,该做法并无确定唯一的答案,同样可以通过多次选择k计算失真函数比较,分类数量越多无疑会使J变小,如果k等于m了那J就是0,所以盲目追求最佳的J是无意义的,不过仍然有一种情况可以明显确定k的选取——肘方法。
即绘制分类数量与J的曲线,当下降斜率出现突然变缓处说明继续增加分类数量效果不再明显,类似胳膊的肘部,可以选取之。
可多数情景下曲线并无肘部,平滑曲线难以判断肘部,主要还是根据项目选择需要几种分类。
异常检测
只对不正常的事件进行预警,使用密度技术检测,若特征反常则报警,根据正态分布p(x,μ,σ^2) = (1 / (σ√(2π))) * e^((-1/2) * ((x-μ)/σ)^2)
建立概率模型,设定阈值ε
,若概率低于该值则说明异常,多用于金融诈骗等情景。
检测过程大致如下:
1,输入特征x1,x2...xn
2,拟合u和δ,公式分别为
3,计算预测值p(x)
,公式为,即多种异常情况同时发生的概率,若预测值小于阈值,说明异常发生。
对比监督学习
异常检测更适用于反面例子多,并且在不断出现新错误的情况,如网络攻击,更适用于安全问题
有监督学习适用于规则相对固定的学习,如垃圾邮件。
推荐算法
首先在没学习该章之前,我们可以先思考以下,软件推荐电影,短视频,甚至广告等都是如何实现的呢?我之前想的是每种视频及广告或者商品本身应该有其标签,比如动作、喜剧等,而软件对我们用户应该也有画像,比如是男大学生,新手妈妈等,将标签符合的人物画像的内容进行推送,并且结合搜索记录等综合考虑。这种方法难点在于标签和画像如何形成,数量太大难以全部人工审核,上传者和用户自己设定是个方法,但毕竟不全又可能造假,我是带着这个疑问来学推荐算法部分。
首先声明代号,nu
表示用户数量,nm
表示推荐内容的数量,r(i,j)
表示是否对用户推荐,取值只有0、1,y(i,j)
推荐程度,只当r
为1时存在,比如影评打星,表示用户的喜爱程度。
这个预测过程我们使用线性回归即可实现,输出一个可能喜欢的值,但使用该方法如何在用户画像尚未建立,即w
和b
还未拟合准确时判断呢?新电影刚上映,特征尚不完善又如何归类呢?也就是我之前想到的标签或者画像的形成问题,该问题可以通过协同过滤来解决。
协同过滤
将用户和推荐内容特征成本函数整合在一起,形成如下表达式:
使用梯度下降同时推三个变量即可,从逻辑上来说,就是从用户选择推电影特征,再由电影特征推用户喜好。
协同过滤二进制推广
如果只要确定用户是否喜欢,比如用户若点击广告,则以后多给推送,可以使用logistic
回归,激活函数设置未g(wx+b)
即可。
均值归一化
上述算法若使用正则化使w
最小,可能导致w
和b
均为0,从而给新用户预测的所有电影都未0,故用户的预测可以改为wx+b+u
,其中u=原有预测-平均喜好
,作为新用户初步预测的初始值。
相关推荐
给用户推荐相近内容时可用xk-xi
的平方和作为指标,值较小则说明内容类似,可以推荐。
缺点
协同过滤不擅长冷启动,即新用户和新内容时的模型建立,完全依赖学习过程中的特征和用户画像建立,但实际中用户注册或推荐内容中会包含很多信息,比如性别、年龄、推荐内容的比如出版商、导演或作者等,使用这些信息可以帮我们更快地建立起模型。
基于内容的过滤
基于用户和内容的特性,可以更好地使用内容特征和用户画像,根据用户画像找相似的推荐内容特征,对用户画像的预测用Vu
表示,对推荐内容的预测用Vm
表示,模型建立过程为:
1,用户的基本信息进入神经网络学习,输出Vu
2,电影基本信息进入神经网络,输出特征Vm
——二者输出层大小相同
3,使用g(v,m)
逻辑回归计算推荐概率
使用该神经网络方法肯定需要大量计算,但好在推荐内容信息在本地存储,其特征可以提前计算,推荐时仅需计算用户特征并预测即可,此外该方法也体现了神经网络可组合的优点,大致流程图如下:
大目录推荐方法
已有数据很大时,每个用户都进行特征比较预测结果仍然太耗时,可能出现新用户注册后过一上午才有推荐内容的情况发生,针对这种大目录的推荐,一般分为两步走:
检索
提前计算更大范围可能推荐给用户的内容,将多种相似的内容添加到推荐列表中,做到广泛覆盖,进行组合后去重并过滤用户已选内容。
排名
该步对推荐内容进行微调,预测用户可能评级后进行排序后再展示给用户。
强化学习
旨在通过奖惩机制,让计算机学习到针对不同状态该采取何种行动的方法,常用于无法穷尽举例,难以获得可用数据集的情况,主要应用于机器人的控制、工厂生产和股票交易中,方法执行过程无需告知正确结果,只需指定奖励函数,计算机自行决定动作。
捡金币示例
当前状态位置向右获得40金币,向左获得一百金币,机器肯定会选择向左移动,但向左需要三步才能获得金币,实际应用中考虑步骤可以通过折现折现实现,比如0.9*0.9*0.9*100
,通过降低折现因子可以让算法找到最快的实现方法,但使用中我们大多采用接近1的数,如0.99,因为该算法控制的场景一般不怎么着急。
奖励也可设置为负,让算法选择推迟获得,基于上述场景,我们可以发现,机器学习的算法策略是选择最大,最近的回报,由当前状态state
,决定要采取的行动action
,其重中之重就是决定采取行动的方法——策略函数。
马尔可夫决策MDP
未来汇报取决于当前状态的决策方法,使用Q(s,a)
状态动作值函数来量化决策,返回应当前状态s
采取a
行动的最高收益,如捡金币状态下的Q(4,右)=40
,Q(4,左)=100*0.9的三次方
。
可如果已知了最高收益还计算啥,判断来源又怎么计算呢?这需要借助贝尔曼方程实现。
贝尔曼方程
用于计算状态行动收益的最大值,用R(s)
表示s
状态的收益,如捡金币中R(1)=100
、R(2)=0
,完整方程为Q(s,a)=R(s)+y*Q(s1,a1)max
,即最大收益为s
状态的奖励+系数*下阶段的最大奖励。
该方程将问题逐步向后拆解,可通过动态规划的思想给所有的行动可能计算出收益。
DQN算法
使用上面的方法只能接近离散状态空间的场景,通过维护一个Q(s,a)
表实现,但当选择并不离散,有连续空间可以选择时又该怎么办呢?有人提出了一种Q学习加神经网络的算法,将状态s
和行动a
作为x
输入神经网络,Q(s,a)
作为y
输出,使用有监督学习,可之前我们提到强化学习一般用于不好获取数据的场景,我们该如何训练网络呢?
获取数据的方法同样是通过贝尔曼方程,R(s)
我们可以通过在拟真中随机尝试获得,但新状态下的Q
我们不得而知-,暂时只能通过猜测假设,在后续网络训练中不断改进,二者相互促进,具体步骤如下:
1,神经网络参数初始化,几乎随机设定,后续训练逐步调整
2,拟真中任意尝试动作,获取不同的R(s)
,只保留最新的一万个数据作为输入x
3,y=R(s)+y*Q(s1,a1)max
,起始的Q(s1,a1)
不得而知只能猜测,随着神经网络的构建,可以逐步使用网络的输出y=Q(s1,a1)new
来代替之
该算法是一个不断重复,逐渐改进,网络和贝尔曼方程逐步完善,相互促进的方法,也体现了网络的训练过程,并将其与其他未知参数的估计结合起来,达到两个未知经过神经网络变成已知的目的。
ε贪婪策略
初始化的参数可能导致某种行为a
下的Q
很低,先入为主,算法可能永远不会执行该动作,进而导致该方向的Q
不会上升,基于这种场景,我们更改原有每次之选最大的Q(s,a)
策略,改为95%的场景选最大,5%的场景随机选一个动作执行。
数值设定是探索与开发的权衡,选最大的效果好,但可能错过新方法,故一般设置为很小的值,偶尔尝试就可以,实际中ε
应该随时间下降,初始可以设置的大一些因为网络建立还不完善。
另外其实贪婪的最大是Q
,而不是只有5%的ε
…
优化方法
通过多次计算不同动作的Q(s,a)
十分低效,可以直接输出多个单元,同时计算所有Q(s,a)
,对不同的行动一次推理获得其最大收益。
小批量处理—Mini-batch
梯度下降在数据量很大时需要计算所有数据的平均值,准确,但很慢,提出一种无需所有示例,每次迭代只取数据中一部分的方法,该方法速度快,但不可靠,是准确和效率的权衡。
软更新
在网络训练中,我们用新的数据直接替代旧数据会产生一个问题,如果该次数据是误差数据,或者网络模型错误估计了此次运算,会导致差数据覆盖了原有好的数据,整体训练方向可能发生便宜,为减少该行为造成的影响,我们将更新方法设置为W=0.01Wnew+0.99W
,即每次只更新一点,使算法尽可能收敛,减少震荡。
总结
本章学习了无监督学习的一些算法,基于数据点距离中心点的分类方法—聚类,推荐算法的协同过滤,解决其冷启动难的内容过滤方法,和基于奖励函数让机器自己根据当前状态决定动作的强化学习,还有在强化学习中使用神经网络的DQN算法,该算法妙在多个未知参数可以经过神经网络的拟合逐渐变得可靠,随着网络模型建立的完善,对其他参数的估计也越来越准确,形成一个相互促进的局面。