㈠ 常用聚类(K-means,DBSCAN)以及聚类的度量指标:
一年前需要用聚类算法时,自己从一些sklearn文档和博客粗略整理了一些相关的知识,记录在电子笔记里备忘,现在发到网上,当时就整理的就很乱,以后有空慢慢把内容整理、完善,用作备忘。之前把电影标签信息的聚类结果作为隐式反馈放进SVD++中去训练,里面有两个小例子
利用条件熵定义的同质性度量:
sklearn.metrics.homogeneity_score:每一个聚出的类仅包含一个类别的程度度量。
sklearn.metrics.completeness:每一个类别被指向相同聚出的类的程度度量。
sklearn.metrics.v_measure_score:上面两者的一种折衷:
v = 2 * (homogeneity * completeness) / (homogeneity + completeness)
可以作为聚类结果的一种度量。
sklearn.metrics.adjusted_rand_score:调整的兰德系数。
ARI取值范围为[-1,1],从广义的角度来讲,ARI衡量的是两个数据分布的吻合程度
sklearn.metrics.adjusted_mutual_info_score:调整的互信息。
利用基于互信息的方法来衡量聚类效果需要实际类别信息,MI与NMI取值范围为[0,1],AMI取值范围为[-1,1]。
在scikit-learn中, Calinski-Harabasz Index对应的方法是metrics.calinski_harabaz_score.
CH指标通过计算类中各点与类中心的距离平方和来度量类内的紧密度,通过计算各类中心点与数据集中心点距离平方和来度量数据集的分离度,CH指标由分离度与紧密度的比值得到。从而,CH越大代表着类自身越紧密,类与类之间越分散,即更优的聚类结果。
silhouette_sample
对于一个样本点(b - a)/max(a, b)
a平均类内距离,b样本点到与其最近的非此类的距离。
silihouette_score返回的是所有样本的该值,取值范围为[-1,1]。
这些度量均是越大越好
K-means算法应该算是最常见的聚类算法,该算法的目的是选择出质心,使得各个聚类内部的inertia值最小化,计算方法如下:
inertia可以被认为是类内聚合度的一种度量方式,这种度量方式的主要缺点是:
(1)inertia假设数据内的聚类都是凸的并且各向同性( convex and isotropic),
各项同性是指在数据的属性在不同方向上是相同的。数据并不是总能够满足这些前提假设的,
所以当数据事细长簇的聚类,或者不规则形状的流形时,K-means算法的效果不理想。
(2)inertia不是一种归一化度量方式。一般来说,inertia值越小,说明聚类效果越好。
但是在高维空间中,欧式距离的值可能会呈现迅速增长的趋势,所以在进行K-means之前首先进行降维操作,如PCA等,可以解决高维空间中inertia快速增长的问题,也有主意提高计算速度。
K-means算法可以在足够长的时间内收敛,但有可能收敛到一个局部最小值。
聚类的结果高度依赖质心的初始化,因此在计算过程中,采取的措施是进行不止一次的聚类,每次都初始化不同的质心。
sklearn中可以通过设置参数init='kmeans++'来采取k-means++初始化方案,
即初始化的质心相互之间距离很远,这种方式相比于随机初始质心,能够取得更好的效果。
另外,sklearn中可以通过参数n_job,使得K-means采用并行计算的方式。
##sklearn 中K-means的主要参数:
1) n_clusters: 设定的k值
2)max_iter: 最大的迭代次数,一般如果是凸数据集的话可以不管这个值,如果数据集不是凸的,可能很难收敛,此时可以指定最大的迭代次数让算法可以及时退出循环。
3)n_init:用不同的初始化质心运行算法的次数。由于K-Means是结果受初始值影响的局部最优的迭代算法,因此需要多跑几次以选择一个较好的聚类效果,默认是10。如果你的k值较大,则可以适当增大这个值。
4)init: 即初始值选择的方式,可以为完全随机选择'random',优化过的'k-means++'或者自己指定初始化的k个质心。一般建议使用默认的'k-means++'。
5)algorithm:有“auto”, “full” or “elkan”三种选择。"full"就是我们传统的K-Means算法, “elkan”elkan K-Means算法。默认的"auto"则会根据数据值是否是稀疏的,来决定如何选择"full"和“elkan”。一般来说建议直接用默认的"auto"
聚类的中心
print clf.cluster_centers_
每个样本所属的簇
print clf.labels_
用来评估簇的个数是否合适,距离越小说明簇分的越好,选取临界点的簇个数
print clf.inertia_
Sum of distances of samples to their closest cluster center.
两个小例子(很久以前弄的,写得比较简略比较乱,有空再改,数据是movielen中的电影标签信息):
例1:
例2,在区间[2,200]上遍历k,并生成两个聚类内部评价指标CH分、轮廓系数以及kmeans自带inertia分和对应的k值的图片来选择k:
其中两点相似度s(i, j)的度量默认采用负欧氏距离。
sklearn.cluster.AffinityPropagation
有参数preference(设定每一个点的偏好,将偏好于跟其他节点的相似性进行比较,选择
高的作为exmplar,未设定则使用所有相似性的中位数)、damping (阻尼系数,
利用阻尼系数与1-阻尼系数对r 及 a进行有关迭代步数的凸组合,使得算法收敛
default 0.5 可以取值与[0.5, 1])
cluster_centers_indices_:中心样本的指标。
AP算法的主要思想是通过数据点两两之间传递的信息进行聚类。
该算法的主要优点是能够自主计算聚类的数目,而不用人为制定类的数目。
其缺点是计算复杂度较大 ,计算时间长同时空间复杂度大,
因此该算法适合对数据量不大的问题进行聚类分析。
数据点之间传递的信息包括两个,吸引度(responsibility)r(i,k)和归属度(availability)a(i,k)。
吸引度r(i,k)度量的是质心k应当作为点i的质心的程度,
归属度a(i,k)度量的是点i应当选择质心k作为其质心的程度。
其中t是迭代的次数,λ是阻尼因子,其值介于[0,1],在sklearn.cluster.AffinityPropagation中通过参数damping进行设置。
每次更新完矩阵后,就可以为每个数据点分配质心,分配方式?是针对数据点i,遍历所有数据点k(包括其自身),
找到一个k使得r(i,k)+a(i,k)的值最大,则点k就是点i所属的质心,迭代这个过程直至收敛。
所谓收敛就是所有点所属的质心不再变化
首先说明不引入核函数时的情况。
算法大致流程为:随机选取一个点作为球心,以一定半径画一个高维球(数据可能是高维的),
在这个球范围内的点都是这个球心的邻居。这些邻居相对于球心都存在一个偏移向量,
将这些向量相加求和再平均,就得到一个mean shift,起点在原球心,重点在球内的其他位置。
以mean shift的重点作为新的球心,重复上述过程直至收敛。
这个计算过程中,高维球内的点,无论其距离球心距离多远,对于mean shift的计算权重是一样的。
为了改善这种情况,在迭代计算mean shift的过程中引入了核函数
sklearn中相关实现是sklearn.cluster.MeanShift。
sklearn中实现的是自底向上的层次聚类,实现方法是sklearn.cluster.AgglomerativeClustering。
初始时,所有点各自单独成为一类,然后采取某种度量方法将相近的类进行合并,并且度量方法有多种选择。
合并的过程可以构成一个树结构,其根节点就是所有数据的集合,叶子节点就是各条单一数据。
sklearn.cluster.AgglomerativeClustering中可以通过参数linkage选择不同的度量方法,用来度量两个类之间的距离,
可选参数有ward,complete,average三个。
ward:选择这样的两个类进行合并,合并后的类的离差平方和最小。
complete:两个类的聚类被定义为类内数据的最大距离,即分属两个类的距离最远的两个点的距离。
选择两个类进行合并时,从现有的类中找到两个类使得这个值最小,就合并这两个类。
average:两个类内数据两两之间距离的平均值作为两个类的距离。
同样的,从现有的类中找到两个类使得这个值最小,就合并这两个类。
Agglomerative cluster有一个缺点,就是rich get richer现象,
这可能导致聚类结果得到的类的大小不均衡。
从这个角度考虑,complete策略效果最差,ward得到的类的大小最为均衡。
但是在ward策略下,affinity参数只能是“euclidean”,即欧式距离。
如果在欧氏距离不适用的环境中,average is a good alternative。
另外还应该注意参数affinity,这个参数设置的是计算两个点之间距离时采用的策略,
注意和参数linkage区分,linkage设置的是衡量两个类之间距离时采用的策略,
而点之间的距离衡量是类之间距离衡量的基础。
affinity的可选数值包括 “euclidean”, “l1”, “l2”, “manhattan”, “cosine”,
‘precomputed’. If linkage is “ward”, only “euclidean” is accepted.
DBSCAN算法的主要思想是,认为密度稠密的区域是一个聚类,各个聚类是被密度稀疏的区域划分开来的。
也就是说,密度稀疏的区域构成了各个聚类之间的划分界限。与K-means等算法相比,该算法的主要优点包括:可以自主计算聚类的数目,不需要认为指定;不要求类的形状是凸的,可以是任意形状的。
DBSCAN中包含的几个关键概念包括core sample,non-core sample,min_sample,eps。
core samle是指,在该数据点周围eps范围内,至少包含min_sample个其他数据点,则该点是core sample,
这些数据点称为core sample的邻居。与之对应的,non-sample是该点周围eps范围内,所包含的数据点个数少于min_sample个。从定义可知,core sample是位于密度稠密区域的点。
一个聚类就是一个core sample的集合,这个集合的构建过程是一个递归的构成。
首先,找到任意个core sample,然后从它的邻居中找到core sample,
接着递归的从这些邻居中的core sample的邻居中继续找core sample。
要注意core sample的邻居中不仅有其他core sample,也有一些non-core smaple,
也正是因为这个原因,聚类集合中也包含少量的non-core sample,它们是聚类中core sample的邻居,
但自己不是core sample。这些non-core sample构成了边界。
在确定了如何通过单一core sample找到了一个聚类后,下面描述DBSCAN算法的整个流程。
首先,扫描数据集找到任意一个core sample,以此core sample为起点,按照上一段描述的方法进行扩充,确定一个聚类。然后,再次扫描数据集,找到任意一个不属于以确定类别的core sample,重复扩充过程,再次确定一个聚类。
迭代这个过程,直至数据集中不再包含有core sample。
这也是为什么DBSCAN不用认为指定聚类数目的原因。
DBSCAN算法包含一定的非确定性。数据中的core sample总是会被分配到相同的聚类中的,哪怕在统一数据集上多次运行DBSCAN。其不确定性主要体现在non-core sample的分配上。
一个non-core sample可能同时是两个core sample的邻居,而这两个core sample隶属于不同的聚类。
DBSCAN中,这个non-core sample会被分配给首先生成的那个聚类,而哪个聚类先生成是随机的。
sklearn中DBSCAN的实现中,邻居的确定使用的ball tree和kd-tree思想,这就避免了计算距离矩阵。
㈡ 聚类结果怎么看
聚类结果可以通过降维图来可视化分析,还可以通过各种聚类指标来看
㈢ 如何评价spss系统聚类分析结果
这是用SPSS系统聚类法做出的聚类结果树状图。1,系统聚类的基本思想是:开始将n个样本各自作为一类,并规定样本之间的距离和类与类之间的距离,然后将距离最近的两类合并成一个新类,计算新类与其他类的距离;重复进行两个最近类合并,每次减少一个类,纸质所有样本合并为一类。你发的树状图就是根据这个过程得来的。
2,最上面一行的距离值表示个案与个案的距离值,这个是软件换算出的,不可以调整。
3,可能是你的SPSS版本较旧的原因,树状图是断开的,可能不太好分辨,新版本都是连上的线段。但仍可继续做分析。根据树状图可知,
第一次合并将7、8合为一类,1、3为一类,2、4、5为一类,说明它们之间最相似,距离最近。
第二次合并将6并入7、8的类。
第三次合并将1、3并入6、7、8所在类。此时总共就剩两类了
第四次,把所有的个体合为一类
4,最终合为一类不代表不分类,而是你根据自己的需要确定类个数,再从图上找结果。比如你最终想分类两类,结果就是『7、8、6、1、3』和『2、4、5』
㈣ 聚类分析之KNN
我们先用一个例子体会下。
假设,我们想对电影的类型进行分类,统计了电影中打斗次数、接吻次数,当然还有其他的指标也可以被统计到,如下表所示。
我们很容易理解《战狼》《红海行动》《碟中谍 6》是动作片,《前任 3》《春娇救志明》《泰坦尼克号》是爱情片,但是有没有一种方法让机器也可以掌握这个分类的规则,当有一部新电影的时候,也可以对它的类型自动分类呢?
我们可以把打斗次数看成 X 轴,接吻次数看成 Y 轴,然后在二维的坐标轴上,对这几部电影进行标记,如下图所示。对于未知的电影 A,坐标为 (x,y),我们需要看下离电影 A 最近的都有哪些电影,这些电影中的大多数属于哪个分类,那么电影 A 就属于哪个分类。实际操作中,我们还需要确定一个 K 值,也就是我们要观察离电影 A 最近的电影有多少个。
KNN 的工作原理
“近朱者赤,近墨者黑”可以说是 KNN 的工作原理。整个计算过程分为三步:
计算待分类物体与其他物体之间的距离;
统计距离最近的 K 个邻居;
对于 K 个最近的邻居,它们属于哪个分类最多,待分类物体就属于哪一类。
K 值如何选择
你能看出整个 KNN 的分类过程,K 值的选择还是很重要的。那么问题来了,K 值选择多少是适合的呢?
如果 K 值比较小,就相当于未分类物体与它的邻居非常接近才行。这样产生的一个问题就是,如果邻居点是个噪声点,那么未分类物体的分类也会产生误差,这样 KNN 分类就会产生过拟合。
如果 K 值比较大,相当于距离过远的点也会对未知物体的分类产生影响,虽然这种情况的好处是鲁棒性强,但是不足也很明显,会产生欠拟合情况,也就是没有把未分类物体真正分类出来。
所以 K 值应该是个实践出来的结果,并不是我们事先而定的。在工程上,我们一般采用交叉验证的方式选取 K 值。
交叉验证的思路就是,把样本集中的大部分样本作为训练集,剩余的小部分样本用于预测,来验证分类模型的准确性。所以在 KNN 算法中,我们一般会把 K 值选取在较小的范围内,同时在验证集上准确率最高的那一个最终确定作为 K 值。
距离如何计算
在 KNN 算法中,还有一个重要的计算就是关于距离的度量。两个样本点之间的距离代表了这两个样本之间的相似度。距离越大,差异性越大;距离越小,相似度越大。
关于距离的计算方式有下面五种方式:
欧氏距离;
曼哈顿距离;
闵可夫斯基距离;
切比雪夫距离;
余弦距离。
其中前三种距离是 KNN 中最常用的距离,我给你分别讲解下。
欧氏距离是我们最常用的距离公式,也叫做欧几里得距离。在二维空间中,两点的欧式距离就是:
同理,我们也可以求得两点在 n 维空间中的距离:
曼哈顿距离在几何空间中用的比较多。以下图为例,绿色的直线代表两点之间的欧式距离,而红色和黄色的线为两点的曼哈顿距离。所以曼哈顿距离等于两个点在坐标系上绝对轴距总和。用公式表示就是:
闵可夫斯基距离不是一个距离,而是一组距离的定义。对于 n 维空间中的两个点 x(x1,x2,…,xn) 和 y(y1,y2,…,yn) , x 和 y 两点之间的闵可夫斯基距离为:
其中 p 代表空间的维数,当 p=1 时,就是曼哈顿距离;当 p=2 时,就是欧氏距离;当 p→∞时,就是切比雪夫距离。
那么切比雪夫距离怎么计算呢?二个点之间的切比雪夫距离就是这两个点坐标数值差的绝对值的最大值,用数学表示就是:max(|x1-y1|,|x2-y2|)。
余弦距离实际上计算的是两个向量的夹角,是在方向上计算两者之间的差异,对绝对数值不敏感。在兴趣相关性比较上,角度关系比距离的绝对值更重要,因此余弦距离可以用于衡量用户对内容兴趣的区分度。比如我们用搜索引擎搜索某个关键词,它还会给你推荐其他的相关搜索,这些推荐的关键词就是采用余弦距离计算得出的。
KD 树
其实从上文你也能看出来,KNN 的计算过程是大量计算样本点之间的距离。为了减少计算距离次数,提升 KNN 的搜索效率,人们提出了 KD 树(K-Dimensional 的缩写)。KD 树是对数据点在 K 维空间中划分的一种数据结构。在 KD 树的构造中,每个节点都是 k 维数值点的二叉树。既然是二叉树,就可以采用二叉树的增删改查操作,这样就大大提升了搜索效率。
在这里,我们不需要对 KD 树的数学原理
了解太多,你只需要知道它是一个二叉树的数据结构,方便存储 K 维空间的数据就可以了。而且在 sklearn 中,我们直接可以调用 KD 树,很方便。
用 KNN 做回归
KNN 不仅可以做分类,还可以做回归。首先讲下什么是回归。在开头电影这个案例中,如果想要对未知电影进行类型划分,这是一个分类问题。首先看一下要分类的未知电影,离它最近的 K 部电影大多数属于哪个分类,这部电影就属于哪个分类。
如果是一部新电影,已知它是爱情片,想要知道它的打斗次数、接吻次数可能是多少,这就是一个回归问题。
那么 KNN 如何做回归呢?
对于一个新电影 X,我们要预测它的某个属性值,比如打斗次数,具体特征属性和数值如下所示。此时,我们会先计算待测点(新电影 X)到已知点的距离,选择距离最近的 K 个点。假设 K=3,此时最近的 3 个点(电影)分别是《战狼》,《红海行动》和《碟中谍 6》,那么它的打斗次数就是这 3 个点的该属性值的平均值,即 (100+95+105)/3=100 次。
总结
今天我给你讲了 KNN 的原理,以及 KNN 中的几个关键因素。比如针对 K 值的选择,我们一般采用交叉验证的方式得出。针对样本点之间的距离的定义,常用的有 5 种表达方式,你也可以自己来定义两个样本之间的距离公式。不同的定义,适用的场景不同。比如在搜索关键词推荐中,余弦距离是更为常用的。
另外你也可以用 KNN 进行回归,通过 K 个邻居对新的点的属性进行值的预测。
KNN 的理论简单直接,针对 KNN 中的搜索也有相应的 KD 树这个数据结构。KNN 的理论成熟,可以应用到线性和非线性的分类问题中,也可以用于回归分析。
不过 KNN 需要计算测试点与样本点之间的距离,当数据量大的时候,计算量是非常庞大的,需要大量的存储空间和计算时间。另外如果样本分类不均衡,比如有些分类的样本非常少,那么该类别的分类准确率就会低很多。
当然在实际工作中,我们需要考虑到各种可能存在的情况,比如针对某类样本少的情况,可以增加该类别的权重。
同样 KNN 也可以用于推荐算法,虽然现在很多推荐系统的算法会使用 TD-IDF、协同过滤、Apriori 算法,不过针对数据量不大的情况下,采用 KNN 作为推荐算法也是可行的。
㈤ 电影用户属性聚类的代码
这类代码基于电影的评分和用户属性的协同过滤混合推荐算法实现。
属性聚类的代码包括系统聚类和动态聚类两种,系统聚类分析更加直观,易懂,而动态聚类则更加快速,动态感。
㈥ 如何用聚类取把电影评分数据集分类
spss聚类分析如果是使用的欧式平方距离进行的分类会产生一张梯度表,利用它做图可以形成聚类的树状图,图上距离越近的类别相似度越高,表格反而没有树状图看起来直观。树状图以距离为标准进行分类,一般学位论文或者期刊论文都采用发表树状图的形式来进行聚类分析表述
㈦ 如何用聚类取把电影评分数据集分类
聚类分析指将物理或抽象对象的集合分组为由类似的对象组成的多个类的分析过程。它是一种重要的人类行为。
聚类分析的目标就是在相似的基础上收集数据来分类。聚类源于很多领域,包括数学,计算机科学,统计学,生物学和经济学。在不同的应用领域,很多聚类技术都得到了发展,这些技术方法被用作描述数据,衡量不同数据源间的相似性,以及把数据源分类到不同的簇中。
㈧ 如何评价聚类结果的好坏
聚类的评估也需要预先标注,把相似的数据放到一个堆(文件)里。算法完成后再进行测试,主要测试宏观准确度,宏观召回率,宏观混杂度。
基于不同算法,会有不同指标,通常较通用的应该一定都会有Entropy熵和Accuracy,(Accuracy 里可以包含了precision, recall, f-measure.)
通常会加上SSE (Sum of squared errors)平方误差和,其他算法会有不同指标。
总体思想为一个cluster聚类内的数据点聚集在一起的密度越高,圈子越小,离centroid中心点越近,那么这个聚类的总体质量相对来说就会越好。
(8)电影评分聚类分析结果扩展阅读
聚类分析将物理或抽象对象的集合分组为由类似的对象组成的多个类的分析过程。它是一种重要的人类行为。
聚类分析的目标就是在相似的基础上收集数据来分类。聚类源于很多领域,包括数学,计算机科学,统计学,生物学和经济学。在不同的应用领域。
很多聚类技术都得到了发展,这些技术方法被用作描述数据,衡量不同数据源间的相似性,以及把数据源分类到不同的簇中。
㈨ 07_推荐系统算法详解
基于人口统计学的推荐与用户画像、基于内容的推荐、基于协同过滤的推荐。
1、基于人口统计学的推荐机制( Demographic-based Recommendation)是一种最易于实现的推荐方法,它只是简单的根据系统用户的基本信息发现用户的相关程度,然后将相似用户喜爱的其他物品推荐给当前用户。
2、对于没有明确含义的用户信息(比如登录时间、地域等上下文信息),可以通过聚类等手段,给用户打上分类标签。
3、对于特定标签的用户,又可以根据预设的规则(知识)或者模型,推荐出对应的物品。
4、用户信息标签化的过程一般又称为 用户画像 ( User Profiling)。
(1)用户画像( User Profile)就是企业通过收集与分析消费者社会属性、生活习惯、消费行为等主要信息的数据之后,完美地抽象出一个用户的商业全貌作是企业应用大数据技术的基本方式。
(2)用户画像为企业提供了足够的信息基础,能够帮助企业快速找到精准用户群体以及用户需求等更为广泛的反馈信息。
(3)作为大数据的根基,它完美地抽象出一个用户的信息全貌,为进一步精准、快速地分析用户行为习惯、消费习惯等重要信息,提供了足够的数据基础。
1、 Content- based Recommendations(CB)根据推荐物品或内容的元数据,发现物品的相关性,再基于用户过去的喜好记录,为用户推荐相似的物品。
2、通过抽取物品内在或者外在的特征值,实现相似度计算。比如一个电影,有导演、演员、用户标签UGC、用户评论、时长、风格等等,都可以算是特征。
3、将用户(user)个人信息的特征(基于喜好记录或是预设兴趣标签),和物品(item)的特征相匹配,就能得到用户对物品感兴趣的程度。在一些电影、音乐、图书的社交网站有很成功的应用,有些网站还请专业的人员对物品进行基因编码/打标签(PGC)。
4、 相似度计算:
5、对于物品的特征提取——打标签(tag)
- 专家标签(PGC)
- 用户自定义标签(UGC)
- 降维分析数据,提取隐语义标签(LFM)
对于文本信息的特征提取——关键词
- 分词、语义处理和情感分析(NLP)
- 潜在语义分析(LSA)
6、 基于内容推荐系统的高层次结构
7、 特征工程
(1)特征( feature):数据中抽取出来的对结果预测有用的信息。
特征的个数就是数据的观测维度。
特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。
特征工程一般包括特征清洗(采样、清洗异常样本),特征处理和特征选择。
特征按照不同的数据类型分类,有不同的特征处理方法:数值型、类别型、时间型、统计型。
(2)数值型特征处理
用连续数值表示当前维度特征,通常会对数值型特征进行数学上的处理,主要的做法是归一化和离散化。
* 幅度调整归一化:
特征与特征之间应该是平等的,区别应该体现在 特征内部 。
例如房屋价格和住房面积的幅度是不同的,房屋价格可能在3000000~15000000(万)之间,而住房面积在40-300(平方米)之间,那么明明是平等的两个特征,输入到相同的模型中后由于本身的幅值不同导致产生的效果不同,这是不合理的
* 数值型特征处理——离散化
离散化的两种方式:等步长——简单但不一定有效;等频——min -> 25% -> 75% -> max
两种方法对比:
等频的离散化方法很精准,但需要每次都对数据分布进行一遍从新计算,因为昨天用户在淘宝上买东西的价格分布和今天不一定相同,因此昨天做等频的切分点可能并不适用,而线上最需要避免的就是不固定,需要现场计算,所以昨天训练出的模型今天不一定能使用。
等频不固定,但很精准,等步长是固定的,非常简单,因此两者在工业上都有应用。
(3) 类别型特征处理
类别型数据本身没有大小关系,需要将它们编码为数字,但它们之间不能有预先设定的大小关系,因此既要做到公平,又要区分开它们,那么直接开辟多个空间。
One-Hot编码/哑变量:One-Hot编码/哑变量所做的就是将类别型数据平行地展开,也就是说,经过One-Hot编码哑变量后,这个特征的空间会膨胀。
(4) 时间型特征处理
时间型特征既可以做连续值,又可以看做离散值。
连续值:持续时间(网页浏览时长);间隔时间(上一次购买/点击离现在的时间间隔)。
离散值:一天中哪个时间段;一周中的星期几;一年中哪个月/星期;工作日/周末。
(5) 统计型特征处理
加减平均:商品价格高于平均价格多少,用户在某个品类下消费超过多少。
分位线:商品属于售出商品价格的分位线处。
次序性:商品处于热门商品第几位。
比例类:电商中商品的好/中/差评比例。
8、 推荐系统常见反馈数据 :
9、 基于UGC的推荐
用户用标签来描述对物品的看法,所以用户生成标签(UGC)是联系用户和物品的纽带,也是反应用户兴趣的重要数据源。
一个用户标签行为的数据集一般由一个三元组(用户,物品,标签)的集合表示,其中一条记录(u,i,b)表示用户u给物品打上了标签b。
一个最简单的算法:
- 统计每个用户最常用的标签
- 对于每个标签,统计被打过这个标签次数最多的物品
- 对于一个用户,首先找到他常用的标签,然后找到具有这些标签的最热门的物品,推荐给他
- 所以用户u对物品i的兴趣公式为 ,其中 使用户u打过标签b的次数, 是物品i被打过标签b的次数。
简单算法中直接将用户打出标签的次数和物品得到的标签次数相乘,可以简单地表现出用户对物品某个特征的兴趣。
这种方法倾向于给热门标签(谁都会给的标签,如“大片”、“搞笑”等)、热门物品(打标签人数最多)比较大的权重,如果一个热门物品同时对应着热门标签,那它就会“霸榜”,推荐的个性化、新颖度就会降低。
类似的问题,出现在新闻内容的关键字提取中。比如以下新闻中,哪个关键字应该获得更高的权重?
10、 TF-IDF:词频逆文档频率 ( Term Frequency- -Inverse Document Frequency,TF-DF)是一种用于资讯检索与文本挖掘的常用加权技术。
TFDF是一种统计方法,用以评估一个字词对于一个文件集或一个语料库中的其中份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
TFIDF=TF IDF
TF-IDF的主要思想是 :如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
TF-DF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。
词频( Term Frequency,TF) :指的是某一个给定的词语在该文件中出现的频率。这个数字是对词数的归一化,以防止偏向更长的文件。(同一个词语在长文件里可能会比短文件有更高的词数,而不管该词语重要与否。) ,其中 表示词语 i 在文档 j 中出现的频率, 表示 i 在 j 中出现的次数, 表示文档 j 的总词数。
逆向文件频率( Inverse Document Frequency,IDF) :是一个词语普遍重要性的度量,某一特定词语的IDF,可以由总文档数目除以包含该词语之文档的数目,再将得到的商取对数得到 ,其中 表示词语 i 在文档集中的逆文档频率,N表示文档集中的文档总数, 表示文档集中包含了词语 i 的文档数。
(11) TF-IDF对基于UGC推荐的改进 : ,为了避免热门标签和热门物品获得更多的权重,我们需要对“热门进行惩罚。
借鉴TF-IDF的思想,以一个物品的所有标签作为“文档”,标签作为“词语”,从而计算标签的“词频”(在物品所有标签中的频率)和“逆文档频率”(在其它物品标签中普遍出现的频率)。
由于“物品i的所有标签” 应该对标签权重没有影响,而 “所有标签总数” N 对于所有标签是一定的,所以这两项可以略去。在简单算法的基础上,直接加入对热门标签和热门物品的惩罚项: ,其中, 记录了标签 b 被多少个不同的用户使用过, 记录了物品 i 被多少个不同的用户打过标签。
(一)协同过滤(Collaborative Filtering, CF)
1、基于协同过滤(CF)的推荐:基于内容( Content based,CB)主要利用的是用户评价过的物品的内容特征,而CF方法还可以利用其他用户评分过的物品内容。
CF可以解决CB的一些局限:
- 物品内容不完全或者难以获得时,依然可以通过其他用户的反馈给出推荐。
- CF基于用户之间对物品的评价质量,避免了CB仅依赖内容可能造成的对物品质量判断的干。
- CF推荐不受内容限制,只要其他类似用户给出了对不同物品的兴趣,CF就可以给用户推荐出内容差异很大的物品(但有某种内在联系)
分为两类:基于近邻和基于模型。
2、基于近邻的推荐系统:根据的是相同“口碑”准则。是否应该给Cary推荐《泰坦尼克号》?
(二)基于近邻的协同过滤
1、 基于用户(User-CF): 基于用户的协同过滤推荐的基本原理是,根据所有用户对物品的偏好,发现与当前用户口味和偏好相似的“邻居”用户群,并推荐近邻所偏好的物品。
在一般的应用中是采用计算“K-近邻”的算法;基于这K个邻居的历史偏好信息,为当前用户进行推荐。
User-CF和基于人口统计学的推荐机制:
- 两者都是计算用户的相似度,并基于相似的“邻居”用户群计算推荐。
- 它们所不同的是如何计算用户的相似度:基于人口统计学的机制只考虑用户本身的特征,而基于用户的协同过滤机制可是在用户的历史偏好的数据上计算用户的相似度,它的基本假设是,喜欢类似物品的用户可能有相同或者相似的口味和偏好。
2、基于物品(Item-CF):基于项目的协同过滤推荐的基本原理与基于用户的类似,只是使用所有用户对物品的偏好,发现物品和物品之间的相似度,然后根据用户的历史偏好信息,将类似的物品推荐给用户。
Item-CF和基于内容(CB)的推荐
- 其实都是基于物品相似度预测推荐,只是相似度计算的方法不一样,前者是从用户历史的偏好推断,而后者是基于物品本身的属性特征信息。
同样是协同过滤,在基于用户和基于项目两个策略中应该如何选择呢?
- 电商、电影、音乐网站,用户数量远大于物品数量。
- 新闻网站,物品(新闻文本)数量可能大于用户数量。
3、 User-CF和Item-CF的比较
同样是协同过滤,在User-CF和ltem-CF两个策略中应该如何选择呢?
Item-CF应用场景
- 基于物品的协同过滤( Item-CF ) 推荐机制是 Amazon在基于用户的机制上改良的一种策略因为在大部分的Web站点中,物品的个数是远远小于用户的数量的,而且物品的个数和相似度相对比较稳定,同时基于物品的机制比基于用户的实时性更好一些,所以 Item-CF 成为了目前推荐策略的主流。
User-CF应用场景
- 设想一下在一些新闻推荐系统中,也许物品一一也就是新闻的个数可能大于用户的个数,而且新闻的更新程度也有很快,所以它的相似度依然不稳定,这时用 User-cf可能效果更好。
所以,推荐策略的选择其实和具体的应用场景有很大的关系。
4、 基于协同过滤的推荐优缺点
(1)基于协同过滤的推荐机制的优点:
它不需要对物品或者用户进行严格的建模,而且不要求对物品特征的描述是机器可理解的,所以这种方法也是领域无关的。
这种方法计算出来的推荐是开放的,可以共用他人的经验,很好的支持用户发现潜在的兴趣偏好。
(2)存在的问题
方法的核心是基于历史数据,所以对新物品和新用户都有“冷启动”的问题。
推荐的效果依赖于用户历史好数据的多少和准确性。
在大部分的实现中,用户历史偏好是用稀疏矩阵进行存储的,而稀疏矩阵上的计算有些明显的问题,包括可能少部分人的错误偏好会对推荐的准确度有很大的影响等等。
对于一些特殊品味的用户不能给予很好的推荐。
(三)基于模型的协同过滤
1、基本思想
(1)用户具有一定的特征,决定着他的偏好选择
(2)物品具有一定的特征,影响着用户需是否选择它。
(3)用户之所以选择某一个商品,是因为用户特征与物品特征相互匹配。
基于这种思想,模型的建立相当于从行为数据中提取特征,给用户和物品同时打上“标签”;这和基于人口统计学的用户标签、基于内容方法的物品标签本质是一样的,都是特征的提取和匹配。
有显性特征时(比如用户标签、物品分类标签)我们可以直接匹配做出推荐;没有时,可以根据已有的偏好数据,去发据出隐藏的特征,这需要用到隐语义模型(LFM)。
2、基于模型的协同过滤推荐,就是基于样本的用户偏好信息,训练一个推荐模型,然后根据实时的用户喜好的信息进行预测新物品的得分,计算推荐
基于近邻的推荐和基于模型的推荐
- 基于近邻的推荐是在预测时直接使用已有的用户偏好数据,通过近邻数据来预测对新物品的偏好(类似分类)
- 而基于模型的方法,是要使用这些偏好数据来训练模型,找到内在规律,再用模型来做预测(类似回归)
训练模型时,可以基于标签内容来提取物品特征,也可以让模型去发据物品的潜在特征;这样的模型被称为 隐语义模型 ( Latent Factor Model,LFM)。
(1)隐语义模型(LFM):用隐语义模型来进行协同过滤的目标:
- 揭示隐藏的特征,这些特征能够解释为什么给出对应的预测评分
- 这类特征可能是无法直接用语言解释描述的,事实上我们并不需要知道,类似“玄学”
通过矩阵分解进行降维分析
- 协同过滤算法非常依赖历史数据,而一般的推荐系统中,偏好数据又往往是稀疏的;这就需要对原始数据做降维处理。
- 分解之后的矩阵,就代表了用户和物品的隐藏特征
隐语义模型的实例:基于概率的隐语义分析(pLSA)、隐式迪利克雷分布模型(LDA)、矩阵因子分解模型(基于奇异值分解的模型,SVD)
(2)LFM降维方法——矩阵因子分解
(3)LFM的进一步理解
我们可以认为,用户之所以给电影打出这样的分数,是有内在原因的,我们可以挖掘出影响用户打分的隐藏因素,进而根据未评分电影与这些隐藏因素的关联度,决定此未评分电影的预测评分。
应该有一些隐藏的因素,影响用户的打分,比如电影:演员、题材、年代…甚至不定是人直接可以理解的隐藏因子。
找到隐藏因子,可以对user和Iiem进行关联(找到是由于什么使得user喜欢/不喜欢此Item,什么会决定user喜欢/不喜欢此item),就可以推测用户是否会喜欢某一部未看过的电影。
(4)矩阵因子分解
(5)模型的求解——损失函数
(6)模型的求解算法——ALS
现在,矩阵因子分解的问题已经转化成了一个标准的优化问题,需要求解P、Q,使目标损失函数取最小值。
最小化过程的求解,一般采用随机梯度下降算法或者交替最小二乘法来实现交替最小二乘法( Alternating Least Squares,ALS)
ALS的思想是,由于两个矩阵P和Q都未知,且通过矩阵乘法耦合在一起,为了使它们解耦,可以先固定Q,把P当作变量,通过损失函数最小化求出P,这就是一个经典的最小二乘问题;再反过来固定求得的P,把Q当作变量,求解出Q:如此交替执行,直到误差满足阅值条件,或者到达迭代上限。
(7)梯度下降算法