首页
友情链接
Search
1
贝壳找房 | Flink 运维体系在贝壳的实践
212 阅读
2
5 年迭代 5 次,抖音基于 Flink 的实时推荐系统演进历程
203 阅读
3
如何通过用户分层,提升用户增长?
129 阅读
4
百分点大数据技术团队:基于多 Spark 任务的 ClickHouse 数据同步方案实践
123 阅读
5
新型智慧城市安全论坛西安举行 促城市数字化转型发展
120 阅读
未分类
人工智能
智能机器人
智慧城市
智慧农业
新零售
智慧教育
智能医疗
智慧金融
AI政策
AI企业
机器学习
AI架构
金融科技
AI+
医疗科技
数据分析
登录
/
注册
Search
标签搜索
机器学习
算法
数据可视化
区块链
人工智能
AI
金融科技
金融
人脸识别
大数据
腾讯
银行
蚂蚁金服
比特币
支付
机器算法学习
算法学习
医疗AI
安防
人工智能架构
AI 技术学习
累计撰写
3,068
篇文章
累计收到
0
条评论
首页
栏目
未分类
人工智能
智能机器人
智慧城市
智慧农业
新零售
智慧教育
智能医疗
智慧金融
AI政策
AI企业
机器学习
AI架构
金融科技
AI+
医疗科技
数据分析
页面
友情链接
搜索到
39
篇与
机器学习
的结果
2021-08-05
Clustering Mixed Data Types in R
Clustering allows us to better understand how a sample might be comprised of distinct subgroups given a set of variables. While many introductions to cluster analysis typically review a simple application using continuous variables, clustering data of mixed types (e.g., continuous, ordinal, and nominal) is often of interest. The following is an overview of one approach to clustering data of mixed types using Gower distance, partitioning around medoids, and silhouette width.In total, there are three related decisions that need to be taken for this approach: Calculating distance Choosing a clustering algorithm Selecting the number of clusters For illustration, the publicly available “College” dataset found in the ISLR package will be used, which has various statistics of US Colleges from 1995 (N = 777). To highlight the challenge of handling mixed data types, variables that are both categorical and continuous will be used and are listed below: Continuous Acceptance rate Out of school tuition Number of new students enrolled Categorical Whether a college is public/private Whether a college is elite, defined as having more than 50% of new students who graduated in the top 10% of their high school class The code was run using R version 3.2.2 with the following packages: set.seed(1680) # for reproducibility library(dplyr) # for data cleaning library(ISLR) # for college dataset library(cluster) # for gower similarity and pam library(Rtsne) # for t-SNE plot library(ggplot2) # for visualization Before clustering can begin, some data cleaning must be done: Acceptance rate is created by diving the number of acceptances by the number of applications isElite is created by labeling colleges with more than 50% of their new students who were in the top 10% of their high school class as elite college_clean % mutate(name = row.names(.), accept_rate = Accept/Apps, isElite = cut(Top10perc, breaks = c(0, 50, 100), labels = c("Not Elite", "Elite"), include.lowest = TRUE)) %>% mutate(isElite = factor(isElite)) %>% select(name, accept_rate, Outstate, Enroll, Grad.Rate, Private, isElite) glimpse(college_clean) ## Observations: 777 ## Variables: 7 ## $ name (chr) "Abilene Christian University", "Ad... ## $ accept_rate (dbl) 0.7421687, 0.8801464, 0.7682073, 0.... ## $ Outstate (dbl) 7440, 12280, 11250, 12960, 7560, 13... ## $ Enroll (dbl) 721, 512, 336, 137, 55, 158, 103, 4... ## $ Grad.Rate (dbl) 60, 56, 54, 59, 15, 55, 63, 73, 80,... ## $ Private (fctr) Yes, Yes, Yes, Yes, Yes, Yes, Yes,... ## $ isElite (fctr) Not Elite, Not Elite, Not Elite, E... Calculating DistanceIn order for a yet-to-be-chosen algorithm to group observations together, we first need to define some notion of (dis)similarity between observations. A popular choice for clustering is Euclidean distance. However, Euclidean distance is only valid for continuous variables, and thus is not applicable here. In order for a clustering algorithm to yield sensible results, we have to use a distance metric that can handle mixed data types. In this case, we will use something called Gower distance.Gower distanceThe concept of Gower distance is actually quite simple. For each variable type, a particular distance metric that works well for that type is used and scaled to fall between 0 and 1. Then, a linear combination using user-specified weights (most simply an average) is calculated to create the final distance matrix. The metrics used for each data type are described below: quantitative (interval): range-normalized Manhattan distance ordinal: variable is first ranked, then Manhattan distance is used with a special adjustment for ties nominal: variables of k categories are first converted into k binary columns and then the Dice coefficient is used pros: Intuitive to understand and straightforward to calculate cons: Sensitive to non-normality and outliers present in continuous variables, so transformations as a pre-processing step might be necessary. Also requires an NxN distance matrix to be calculated, which is computationally intensive to keep in-memory for large samples Below, we see that Gower distance can be calculated in one line using the daisy function. Note that due to positive skew in the Enroll variable, a log transformation is conducted internally via the type argument. Instructions to perform additional transformations, like for factors that could be considered as asymmetric binary (such as rare events), can be seen in ?daisy. # Remove college name before clustering gower_dist 15 & X -15 & Y % left_join(college_clean, by = "name") %>% collect %>% .[["name"]] ## [1] "College of William and Mary" ## [2] "Georgia Institute of Technology" ## [3] "SUNY at Binghamton" ## [4] "SUNY College at Geneseo" ## [5] "Trenton State College" ## [6] "University of California at Berkeley" ## [7] "University of California at Irvine" ## [8] "University of Florida" ## [9] "University of Illinois - Urbana" ## [10] "University of Michigan at Ann Arbor" ## [11] "University of Minnesota at Morris" ## [12] "University of North Carolina at Chapel Hill" ## [13] "University of Virginia" A Final Note: Dealing with Larger Samples and One-Hot EncodingBecause using a custom distance metric requires keeping an NxN matrix in memory, it starts to become noticeable for larger sample sizes (> 10,000 or so on my machine). For clustering larger samples, I have found two options: Two-step clustering in SPSS: This model-based clustering approach can handle categorical and continuous variables and utilizes silhouette width (using rule-of-thumb cutoffs) to find the optimal number of clusters. Using Euclidean distance on data that has been one-hot encoded: While much quicker computationally, note that this is not optimal as you run into the curse of dimensionality fairly fast since all categoricals are recoded to become sparse matrices. Note that this approach is actually fairly similar to the dice coefficient found in calculation of Gower distance, except it incorrectly labels 0-0 as a match. More on this can be seen in this discussion. AboutI am a lead data scientist for Organizational Solutions at McKinsey & Company, interested in statistics, machine learning, education, and open science, among other things. All opinions and views expressed on this blog are my own and do not represent my employer.
2021年08月05日
14 阅读
0 评论
0 点赞
2021-07-26
Python 实现推荐系统
引言最早的推荐系统应该是亚马逊为了提升长尾货物的用户抵达率而发明的。已经有数据证明,长尾商品的销售额以及利润总和与热门商品是基本持平的。亚马逊网站上在线销售的商品何止百万,但首页能够展示的商品数量又极其有限,给用户推荐他们可能喜欢的商品就成了一件非常重要的事情。当然,商品搜索也是一块大蛋糕,亚马逊的商品搜索早已经开始侵蚀谷歌的核心业务了。从这些例子之中,我们可以看到我们能够使用许多不同的方式来搜集兴趣偏好。有时候,这些数据可能来自人们购买的商品,以及这些商品关联的评价信息。我们可以利用一组算法从中挖掘,建立几个有意思的推荐系统。推荐系统的简介两种最普遍的推荐系统的类型是基于内容的推荐系统和协同过滤推荐系统(CF)。协同过滤基于用户对产品的态度产生推荐,基于内容的推荐系统基于物品属性的相似性进行推荐。CF可以分为基于内存的协同过滤和基于模型的协同过滤。基于内容推荐基于内容的推荐(Content-based Recommendation),它是建立在项目的内容信息上作出推荐的,而不需要依据用户对项目的评价意见,更多地需要用机器学习的方法从关于内容的特征描述的事例中得到用户的兴趣资料。在基于内容的推荐系统中,项目或对象是通过相关的特征的属性来定义,系统基于用户评价对象的特征,学习用户的兴趣,考察用户资料与待预测项目的相匹配程度。用户的资料模型取决于所用学习方法,常用的有决策树、神经网络和基于向量的表示方法等。基于内容推荐方法的优点是: 不需要其它用户的数据,没有冷开始问题和稀疏问题。 能为具有特殊兴趣爱好的用户进行推荐。 能推荐新的或不是很流行的项目,没有新项目问题。 通过列出推荐项目的内容特征,可以解释为什么推荐那些项目。 已有比较好的技术,如关于分类学习方面的技术已相当成熟。 缺点是:要求内容能容易抽取成有意义的特征,要求特征内容有良好的结构性,并且用户的口味必须能够用内容特征形式来表达,不能显式地得到其它用户的判断情况。协同过滤推荐协同过滤推荐(Collaborative Filtering Recommendation),是推荐系统中应用最早和最为成功的技术之一。它一般采用最近邻技术,利用用户的历史喜好信息计算用户之间的距离,然后利用目标用户的最近邻居用户对商品评价的加权评价值来预测目标用户对特定商品的喜好程度,系统从而根据这一喜好程度来对目标用户进行推荐。协同过滤最大优点是对推荐对象没有特殊的要求,能处理非结构化的复杂对象,如音乐、电影。协同过滤是基于这样的假设:为一用户找到他真正感兴趣的内容的好方法是首先找到与此用户有相似兴趣的其他用户,然后将他们感兴趣的内容推荐给此用 户。其基本思想非常易于理解,在日常生活中,我们往往会利用好朋友的推荐来进行一些选择。协同过滤正是把这一思想运用到电子商务推荐系统中来,基于其他用 户对某一内容的评价来向目标用户进行推荐。基于协同过滤的推荐系统可以说是从用户的角度来进行相应推荐的,而且是自动的即用户获得的推荐是系统从购买模式或浏览行为等隐式获得的,不需要用户努力地找到适合自己兴趣的推荐信息,如填写一些调查表格等。和基于内容的过滤方法相比,协同过滤具有如下的优点: 能够过滤难以进行机器自动内容分析的信息,如艺术品,音乐等。 共享其他人的经验,避免了内容分析的不完全和不精确,并且能够基于一些复杂的,难以表述的概念(如信息质量、个人品味)进行过滤。 有推荐新信息的能力。可以发现内容上完全不相似的信息,用户对推荐信息的内容事先是预料不到的。这也是协同过滤和基于内容的过滤一个较大的差别,基于内容的过滤推荐很多都是用户本来就熟悉的内容,而协同过滤可以发现用户潜在的但自己尚未发现的兴趣偏好。 能够有效的使用其他相似用户的反馈信息,较少用户的反馈量,加快个性化学习的速度。 缺点是:最典型的问题有,稀疏问题(Sparsity)可扩展问题(Scalability)冷启动问题实例应用我们下面通过使用MovieLens数据集(这是一个有关电影评分的经典数据集, 其中Movielens-100k和movielens-1M有用户对电影的打分,电影的title、genre、IMDB链接、用户的gender、age、occupation、zip code。movielens-10M中还有用户对电影使用的tag信息。)数据集的下载地址数据读取 import numpy as npimport pandas as pdheader = ['user_id','item_id','rating','timestamp']df = pd.read_csv('/home/ef/Desktop/ml-100k/u.data',sep='\t',names=header)print(df.head())n_users = df.user_id.unique().shape[0]n_items = df.item_id.unique().shape[0]print('Number of users = ' + str(n_users) + ' | Number of movies = ' + str(n_items)) 输出结果:user_id item_id rating timestamp0 196 242 3 8812509491 186 302 3 8917177422 22 377 1 8788871163 244 51 2 8806069234 166 346 1 886397596Number of users = 943 | Number of movies = 1682数据划分使用scikit-learn库来划分数据集 from sklearn import cross_validation as cvX_train,x_test = cv.train_test_split(df,test_size=0.2) 基于内存的协同过滤基于内存的协同过滤方法可以分为两个部分: 用户-产品协同过滤,即:基于用户的协同过滤推荐 产品-产品协同过滤,即:基于物品的协同过滤推荐 基于用户的协同过滤推荐,将选取一个特定的用户,基于打分的相似性发现类似于该用户的用户,并推荐那些相似用户喜欢的产品。基于物品的协同过滤推荐会选取一个产品,发现喜欢该产品的用户,并找到这些相似用户还喜欢的其它产品。基于用户的协同过滤推荐:“喜欢这东西的人也喜欢……”基于物品的协同过滤推荐:“像你一样的人也喜欢(买个该商品的还买了)……”在这两种情况下,从整个数据集构建一个用户产品矩阵。用户产品矩阵的例子:计算相似性,并创建一个相似性矩阵。通常用于推荐系统中的距离矩阵是余弦相似性,其中,打分被看成n维空间中的向量,而相似性是基于这些向量之间的角度进行计算的。用户a和b的余弦相似性可以用下面的公式进行计算:Similarcosu(Ua,Ub)=Ua∗Ub||Ua||∗||Ub||=∑xa,mxb,m√∑x2a,m∑x2b,m同时,物品a和b的相似读也可以写成以上形式。创建用户产品矩阵,针对测试数据和训练数据,创建两个矩阵: from sklearn import cross_validation as cvX_train,x_test = cv.train_test_split(df,test_size=0.2) train_data_matrix = np.zeros((n_users,n_items))for line in X_train.itertuples():train_data_matrix[line[1]-1, line[2]-1] = line[3]test_data_matrix = np.zeros((n_users, n_items))for line in x_test.itertuples():test_data_matrix[line[1]-1, line[2]-1] = line[3] ## 通过余弦相似度计算用户和物品的相似度from sklearn.metrics.pairwise import pairwise_distancesuser_similarity = pairwise_distances(train_data_matrix, metric = "cosine")item_similarity = pairwise_distances(train_data_matrix.T, metric = "cosine") 评估这里采用均方根误差(RMSE)来度量预测评分的准确性,可以使用sklearn的mean_square_error(MSE)函数,其中RMSE仅仅是MSE的平方根。 from sklearn.metrics import mean_squared_errorfrom math import sqrtdef rmse(prediction, ground_truth):prediction = prediction[ground_truth.nonzero()].flatten()ground_truth = ground_truth[ground_truth.nonzero()].flatten()return sqrt(mean_squared_error(prediction, ground_truth)) print ('User based CF RMSE: ' + str(rmse(user_prediction, test_data_matrix)))print ('Item based CF RMSe: ' + str(rmse(item_prediction, test_data_matrix)))print ('User based CF RMSE: ' + str(rmse(user_prediction, test_data_matrix)))print ('Item based CF RMSe: ' + str(rmse(item_prediction, test_data_matrix))) 输出结果:User based CF RMSE: 3.087357412872858Item based CF RMSe: 3.437038163412728但从结果来看,算法的推荐效果还算理想。基于模型的协同过滤基于模型的协同过滤是基于矩阵分解(MF)的,矩阵分解广泛应用于推荐系统中,它比基于内存的CF有更好的扩展性和稀疏性。MF的目标是从已知的评分中学习用户的潜在喜好和产品的潜在属性,随后通过用户和产品的潜在特征的点积来预测未知的评分。这是一个典型的机器学习的问题,可以将已有的用户喜好信息作为训练样本,训练出一个预测用户喜好的模型,这样以后用户在进入系统,可以基于此模型计算推荐。这种方法的问题在于如何将用户实时或者近期的喜好信息反馈给训练好的模型,从而提高推荐的准确度。SVDSVD即:奇异值分解(Singular value decomposition)奇异值分解是线性代数中一种重要的矩阵分解,在信号处理、统计学等领域有重要应用。奇异值分解在某些方面与对称矩阵或Hermite矩阵基于特征向量的对角化类似。然而这两种矩阵分解尽管有其相关性,但还是有明显的不同。对称阵特征向量分解的基础是谱分析,而奇异值分解则是谱分析理论在任意矩阵上的推广。在矩阵M的奇异值分解中M=UΣVT U的列(columns)组成一套对M的正交”输入”或”分析”的基向量。这些向量是MM*的特征向量。 V的列(columns)组成一套对M的正交”输出”的基向量。这些向量是M*M的特征向量。 Σ对角线上的元素是奇异值,可视为是在输入与输出间进行的标量的”膨胀控制”。这些是M*M及MM*的奇异值,并与U和V的列向量相对应。 那么矩阵M就可以分解成U,Σ,V。U矩阵表示对应于隐藏特性空间中的用户的特性矩阵,而V矩阵表示对应于隐藏特性空间中的产品的特性矩阵。现在,我们可以通过U,Σ和VT的点积进行预测了。 # 计算矩阵的稀疏度sparsity = round(1.0 - len(df) / float(n_users*n_items),3)print('The sparsity level of MovieLen100K is ' + str(sparsity * 100) + '%') import scipy.sparse as spfrom scipy.sparse.linalg import svdsu, s, vt = svds(train_data_matrix, k = 20)s_diag_matrix = np.diag(s)x_pred = np.dot(np.dot(u,s_diag_matrix),vt)print('User-based CF MSE: ' + str(rmse(x_pred, test_data_matrix))) 输出结果:The sparsity level of MovieLen100K is 93.7%User-based CF MSE: 2.63901831155016最后,我们可以发现,采用SVD分解矩阵的基于模型的协同过滤方法在推荐的表现上更胜一筹。
2021年07月26日
32 阅读
0 评论
0 点赞
2021-07-26
Louvain 算法原理
Louvain算法是一种基于图数据的社区发现算法,算法的优化目标为最大化整个数据的模块度,模块度的计算如下:其中m为图中边的总数量,k_i表示所有指向节点i的连边权重之和,k_j同理。A_{i,j} 表示节点i,j之间的连边权重。有一点要搞清楚,模块度的概念不是Louvain算法发明的,而Louvain算法只是一种优化关系图模块度目标的一种实现而已。Louvain算法的两步迭代设计:最开始,每个原始节点都看成一个独立的社区,社区内的连边权重为0.算法扫描数据中的所有节点,针对每个节点遍历该节点的所有邻居节点,衡量把该节点加入其邻居节点所在的社区所带来的模块度的收益。并选择对应最大收益的邻居节点,加入其所在的社区。这一过程化重复进行指导每一个节点的社区归属都不在发生变化。对步骤1中形成的社区进行折叠,把每个社区折叠成一个单点,分别计算这些新生成的“社区点”之间的连边权重,以及社区内的所有点之间的连边权重之和。用于下一轮的步骤1。该算法的最大优势就是速度很快,步骤1的每次迭代的时间复杂度为O(N),N为输入数据中的边的数量。步骤2 的时间复杂度为O(M + N), M为本轮迭代中点的个数。迭代过程:1, 假设我们最开始有5个点,互相之间存在一定的关系(至于什么关系,先不管),如下: 2. 假设在进过了步骤1的充分迭代之后发现节点2,应该加入到节点1所在的社区(最开始每个点都是一个社区,而自己就是这个社区的代表),新的社区由节点1代表,如下:此时节点3,4,5之间以及与节点1,2之间没有任何归属关系。3. 此时应该执行步骤2,将节点1,2组合成的新社区进行折叠,折叠之后的社区看成一个单点,用节点1来代表,如下:此时数据中共有4个节点(或者说4个社区),其中一个社区包含了两个节点,而社区3,4,5都只包含一个节点,即他们自己。4. 重新执行步骤1,对社区1,3,4,5进行扫描,假设在充分迭代之后节点5,4,3分别先后都加入了节点1所在的社区,如下: 5. 进行步骤2,对新生成的社区进行折叠,新折叠而成的社区看成一个单点,由节点1代表,结构如下:此时由于整个数据中只剩下1个社区,即由节点1代表的社区。再进行步骤1时不会有任何一个节点的社区归属发生变化,此时也就不需要再执行步骤2,至此, 迭代结束。
2021年07月26日
77 阅读
0 评论
0 点赞
2021-07-23
CBC数据分析—Logit模型
作者 刘强、曾步凡 在这个系列文章里,我们曾介绍过使用简单的回归来分析联合分析的数据。但是随着产品的复杂程度的增加,这种方式就不太适用了。一方面是当产品的属性和水平较多时,每个消费者需要评估的概念产品数量变得更多,即便通过试验设计的方式,每个消费者也可能需要评估几十甚至上百个概念产品,而消费者不可能有耐心完成这么冗长的评估;另一方面在于打分这种评估方式存在很多缺陷,不同的消费者理解打分尺度是不同的。因此,一种新的联合分析方法走上了历史的舞台,即基于选择的联合分析(Choice Based Conjoint,简称CBC;也有很多学者称为Discrete Choice Model,简称DCM)。 CBC需要消费者回答的问题更加贴近消费者真实的消费决策,即消费者是在一些产品中做选择,而非对每个产品打分。但是,对比早期的传统方式的联合分析(对每个概念产品进行评估),CBC(从若干个概念产品中选择最偏好的产品)的数据收集效率较低。消费者在做出选择之前必须比较多个概念产品的信息,而消费者的选择只是表明他们最喜欢那个产品而非其对每个产品的偏好强度。 因此,研究者往往需要把很多消费者的CBC选择数据堆加在一起,形成一个很大的数据集来进行效用值的估算。因此,逻辑模型(Logit model)成为了CBC早期分析的主流方法。 我们以一个简单的例子来看看CBC数据的逻辑模型是如何编码和估算效用值的。属性水平的效用值是任何联合分析的最基本输出结果,也是最重要的结果之一,所有其他的分析(偏好模拟,属性水平溢价,需求曲线及弹性等)都要基于效用值估算结果。 以购买笔记本电脑产品为例,假设我们在购买时需要考虑以下几个属性,每个属性中有不同的水平: 我们每次展示给消费者3个概念产品,让消费者选择最可能购买的产品(或者“都不购买”),并且重复这个过程6次(每次展示的概念产品是不同的)。以下是其中一次展示的概念产品及消费者的选择: 编码(Coding) CBC的数据在具体分析前必须进行适当的编码。上面这个选择题的概念产品部分可以转化为以下这种形式的数据: 这里的ID代表了受访者的编号;Task则是任务号,每个选择题即是一个任务。每个受访者会做6个这样的选择题(6个任务)。Concept这一列代表了概念产品编号,每个任务中有3个概念产品。每个概念产品的具体展示水平则由后面的数字代表。以第一行数据为例,该受访者在第一题中的看到的第一个概念产品的品牌是3号水平(联想),CPU是2号水平(i5),屏幕尺寸是1号水平(13”),内存及硬盘是3号水平(16G/512G SSD),价格是1号水平(4000元)。 如果我们把这个受访者看到的前3个任务的概念产品设计都按此编码,则数据形式如下: 这样的数据还必须进行进一步的编码。一般可以采用dummy-coding或effect-coding的方式。如果一个属性有k个水平,那么在经过dummy-coding或effect-coding后,我们都会将该属性编码为k-1个变量,因为需要把其中一个水平设为参照水平。 以品牌属性为例,如果把第三个水平(联想)设为参照水平(reference),则dummy-coding和effect-coding后每个属性水平对应的新变量(A1L1,A1L2)值为: 可以看到这两种coding方式的差别仅体现在参照水平的编码上。dummy-coding是将参照水平在新变量上都设为0,而effect-coding则是都设为-1。因此,上面第一个任务经过effect-coding后的数据就是这个样子 除此之外,由于我们在实验设计中加入了“这些都不会购买”(None)选项,每个Task中需要插入第4个Concept,其编码是所有变量都为0,而在最后的None变量中编码为1。如下图所示: 如果我们在这个数据里再加上受访者的选择(Response列),则构成了这个任务的完整数据,这里看到受访者选择了第三个概念产品(Response的第三行为1): 现在我们把所有任务的数据都按照这种方式编码,则最终我们的数据形式为: (注:这里只展示了第一个受访者coding后的数据)可以看到自变量有12个(对应11个属性水平及1个None水平),因变量有1个。 Excel进行Logit model估算 在完成编码后,我们把所有100个受访者的数据叠加在一起。接下来,我们可以使用Excel估算属性水平的效用值。根据随机效用理论(Random utility theory),一般认为人们对不同概念产品的实际偏好效用存在一定的随机性,且这种随机扰动往往服从Gumbel distribution。由此我们可以推算出在面对多个对象时,人们选择第i个概念产品为“最喜欢”的期望概率(也被称为似然度–Likelihood)为: 首先我们为每个水平设置一个效应值系数(也称为part-worth或utility,β),如下图中蓝色区域。初始系数不妨均设为0。 Q列:每一个概念产品的总效用值的计算可以使用sumproduct函数,将系数和对应的effect- coding编码进行相乘。 R列:偏好分数是由每个效用值取自然指数获得的,也就等于“exp(总效用值)”。 S列:被选择概率则是每个concept在该Task中偏好分数的占比,具体计算是用偏好分数除以其所在Task的偏好分数之和。 T列:实际选择概率则是单独将受访者选中的concept的被选择概率取出来,用来计算上面的RLH(Root likelihood,所有实际选择概率的几何平均数)。 U列:log(p)是将实际选择概率取自然对数,用来计算log-likelihood(所有log(p)之和)。 对这些概念的汇总,可以参考下表: 读者也可以效仿下图中Excel的具体公式自己动手试一下: 建立好模型后,我们需要用到Excel的优化求解工具(Solver),点击“数据(Data)—>优化求解(Solver)”,并做如下图设置: 我们设置的目标单元格是对数似然度,求解的目标是将其最大化,通过改变系数来达到目标(我们当然也可以通过最大化RLH来求解)。通过求解(点击Solve按钮),我们得到了如下结果: 我们可以用RLH来评估刚才求解出的这组效用值对模型的拟合效果,0.403的RLH表示我们估算出来的属性水平效用值能以40.3%的概率准确拟合这100个受访者的实际选择情况。接下来,我们可以利用这些属性水平的效用值进行市场模拟等分析,我们将会在后续文章中详细介绍。 使用R进行估算 用Excel Solver的优势是能将整个logit model的编码及分析过程简单直接地展示出来,并且了解条件逻辑模型的优化目标。然而在实际分析中,在数据量较大时Excel处理起来就比较耗时了,而且有出现陷入局部最优解,或者exp函数的数值溢出等问题。如果没有专业商用联合分析软件(如Sawtooth Software,SAS等)的情况下,我们还可以选择开源免费的R来帮我们完成分析。 R语言处理数据不单单能够大大提高效率和估算精度,其开源、轻便的特性也越来越收到数据分析人员的青睐。在条件逻辑模型的估算中,我们推荐使用mlogit拓展包。 我们把上文已经做好了effect-coding的原始数据保存到一个名为response.csv的文件中。 接下来,首先在R中安装并加载拓展包。 >install.packages(‘mlogit’)>library(mlogit) 然后将response.csv文件读入(需要事先将该文件所在文件夹路径用setwd函数设置好) >rawnAltsPerSet=4 然后我们将公式赋值到变量tmps中: >tmpsmm$coefficients 代码中参数的具体作用请查阅mlogit拓展包的说明。在我们这个案例的演示中,5行代码便完成了条件逻辑模型的估算。 结果比较 Excel Solver得出的结果: R 得出的结果: 可以看到R和Excel Solver得到的结果完全一致,这个结果也和Sawtooth Software或SAS的运算结果完全一致。需要注意的是,由于我们在编码时移除了每个属性中最后一个水平,在Excel和R的结果基础上,我们需要手动将被移除的参照水平的效用值补回(Sawtooth Software会自动完成这个步骤)。基于effect-coding的特性,缺失的参照水平的效用值(记为β m|Attα)等于该水平所在属性(记为Attα)中其他水平效用值之和的负数。 例如“联想”的效用值等于“惠普”和“戴尔”效用值之和的负数,也就是-(-0.322+0.296)≈0.03。将每个被移除的水平补足后,我们会得到如下的最终效用值结果: 虽然使用不同的软件我们得到了相同的结果,但这三种方法在建模过程、运算效率、学习难度等不同方面都有着不同的表现: CBC算法技术的发展 在CBC方法出现的早期,样本层面的逻辑模型(Logit model)的确是最主流的分析模型。但是很快研究人员和营销人员就发现,把所有受访者的数据叠加在一起有可能会低估不同细分人群的偏好差异,如果样本里存在多个不同消费习惯的细分人群,那么样本层面的Logit模型用一组效用值来代表样本中所有个体的偏好肯定是有失偏颇。这个期间,有很多研究者开始使用Latent Class方法来同时实现受访者的人群细分及估算每个细分人群的效用值,并取得了较好的分析结果。 但是技术的发展是无止境的,随着计算机软硬件能力的进一步提升,基于Logit模型的分层贝叶斯算法(Hierarchical Bayesian)被逐步应用到了CBC分析的领域。通过分层贝叶斯算法,我们可以计算每个消费者的效用值。以我们的案例为例,样本层面的逻辑模型估算了1组共16个水平的效用值,而HB算法则会估算100组16个水平的效用值,即每个人都有其各自的效用值。HB算法通过迭代完成估计的,下图是把我们的数据使用HB算法进行迭代的过程: 可以看到HB估算的RLH能够达到0.769,跟样本层面逻辑模型比(RLH=0.403)有显著提升,这一方面反映出我们的100位受访者都较有“个性”,另一方面也体现了HB估算的结果在联合分析中能够大幅提高预测准确率。下图是HB估算出的前20位受访者各自的效用值及拟合优度(RLH)。可以看到HB在每个个体受访者上都大大提升了拟合准确率(样本总体层面logit model得到的RLH仅为0.403)。而且不同消费者的偏好差异也清晰地体现了出来。 因此,目前的CBC类型的联合分析的主流算法已经是HB的天下。不过,逻辑模型依然是各种类型算法的核心,希望大家通过我们的介绍能理解CBC联合分析的原理,解开心中的一些疑问。 注:以上文章欢迎转发分享,请注明出处;版权为上海大正市场研究公司所有,未经许可不得用于任何商业用途。
2021年07月23日
37 阅读
0 评论
0 点赞
2021-07-23
[Algorithm] 局部敏感哈希算法(Locality Sensitive Hashing)
阅读目录 1. 基本思想 2. 局部敏感哈希LSH 3. 文档相似度计算 局部敏感哈希(Locality Sensitive Hashing,LSH)算法是我在前一段时间找工作时接触到的一种衡量文本相似度的算法。局部敏感哈希是近似最近邻搜索算法中最流行的一种,它有坚实的理论依据并且在高维数据空间中表现优异。它的主要作用就是从海量的数据中挖掘出相似的数据,可以具体应用到文本相似度检测、网页搜索等领域。1. 基本思想局部敏感哈希的基本思想类似于一种空间域转换思想,LSH算法基于一个假设,如果两个文本在原有的数据空间是相似的,那么分别经过哈希函数转换以后的它们也具有很高的相似度;相反,如果它们本身是不相似的,那么经过转换后它们应仍不具有相似性。哈希函数,大家一定都很熟悉,那么什么样的哈希函数可以具有上述的功能呢,可以保持数据转化前后的相似性?当然,答案就是局部敏感哈希。2. 局部敏感哈希LSH局部敏感哈希的最大特点就在于保持数据的相似性,我们通过一个反例来具体介绍一下。假设一个哈希函数为Hash(x) = x%8,那么我们现在有三个数据分别为255、257和1023,我们知道255和257本身在数值上具有很小的差距,也就是说它们在三者中比较相似。我们将上述的三个数据通过Hash函数转换:Hash(255) = 255%8 = 7;Hash(257) = 257%8 = 1;Hash(1023) = 1023%8 = 7;我们通过上述的转换结果可以看出,本身很相似的255和257在转换以后变得差距很大,而在数值上差很多的255和1023却对应相同的转换结果。从这个例子我们可以看出,上述的Hash函数从数值相似度角度来看,它不是一个局部敏感哈希,因为经过它转换后的数据的相似性丧失了。我们说局部敏感哈希要求能够保持数据的相似性,那么很多人怀疑这样的哈希函数是否真的存在。我们这样去思考这样一个极端的条件,假设一个局部敏感哈希函数具有10个不同的输出值,而现在我们具有11个完全没有相似度的数据,那么它们经过这个哈希函数必然至少存在两个不相似的数据变为了相似数据。从这个假设中,我们应该意识到局部敏感哈希是相对的,而且我们所说的保持数据的相似度不是说保持100%的相似度,而是保持最大可能的相似度。对于局部敏感哈希“保持最大可能的相似度”的这一点,我们也可以从数据降维的角度去考虑。数据对应的维度越高,信息量也就越大,相反,如果数据进行了降维,那么毫无疑问数据所反映的信息必然会有损失。哈希函数从本质上来看就是一直在扮演数据降维的角色。 3. 文档相似度计算我们通过利用LSH来实现文档的相似度计算这个实例来介绍一下LSH的具体用法。 3.1 Shingling假设现在有4个网页,我们将它们分别进行Shingling(将待查询的字符串集进行映射,映射到一个集合里,如字符串“abcdeeee”, 映射到集合”(a,b,c,d,e)”, 注意集合中元素是无重复的,这一步骤就叫做Shingling, 意即构建文档中的短字符串集合,即shingle集合。),得到如下的特征矩阵:其中“1”代表对应位置的Shingles在文档中出现过,“0”则代表没有出现过。在衡量文档的相似度中,我们有很多的方法去完成,比如利用欧式距离、编辑距离、余弦距离、Jaccard距离等来进行相似度的度量。在这里我们运用Jaccard相似度。接下来我们就要去找一种哈希函数,使得在hash后尽量还能保持这些文档之间的Jaccard相似度,即:我们的目标就是找到这样一种哈希函数,如果原来文档的Jaccard相似度高,那么它们的hash值相同的概率高,如果原来文档的Jaccard相似度低,那么它们的hash值不相同的概率高,我们称之为Min-hashing(最小哈希)。 3.2 Min-hashingMin-hashing定义为:特征矩阵按行进行一个随机的排列后,第一个列值为1的行的行号。举例说明如下,假设之前的特征矩阵按行进行的一个随机排列如下: 元素 S1 S2 S3 S4 他 0 0 1 0 成功 0 0 1 1 我 1 0 0 0 减肥 1 0 1 1 要 0 1 0 1 最小哈希值:h(S1)=3,h(S2)=5,h(S3)=1,h(S4)=2.为什么定义最小hash?事实上,两列的最小hash值就是这两列的Jaccard相似度的一个估计,换句话说,两列最小hash值同等的概率与其相似度相等,即P(h(Si)=h(Sj)) = sim(Si,Sj)。为什么会相等?我们考虑Si和Sj这两列,它们所在的行的所有可能结果可以分成如下三类:(1)A类:两列的值都为1;(2)B类:其中一列的值为0,另一列的值为1;(3)C类:两列的值都为0.特征矩阵相当稀疏,导致大部分的行都属于C类,但只有A、B类行的决定sim(Si,Sj),假定A类行有a个,B类行有b个,那么sim(si,sj)=a/(a+b)。现在我们只需要证明对矩阵行进行随机排列,两个的最小hash值相等的概率P(h(Si)=h(Sj))=a/(a+b),如果我们把C类行都删掉,那么第一行不是A类行就是B类行,如果第一行是A类行那么h(Si)=h(Sj),因此P(h(Si)=h(Sj))=P(删掉C类行后,第一行为A类)=A类行的数目/所有行的数目=a/(a+b),这就是最小hash的神奇之处。Min-hashing的具体做法可以根据如下进行表述:返回到我们的实例,我们首先生成一堆随机置换,把特征矩阵的每一行进行置换,然后hash function就定义为把一个列C hash成一个这样的值:就是在置换后的列C上,第一个值为1的行的行号。如下图所示: 图中展示了三个置换,就是彩色的那三个,我现在解释其中的一个,另外两个同理。比如现在看蓝色的那个置换,置换后的Signature Matrix为: 然后看第一列的第一个是1的行是第几行,是第2行,同理再看二三四列,分别是1,2,1,因此这四列(四个document)在这个置换下,被哈希成了2,1,2,1,就是右图中的蓝色部分,也就相当于每个document现在是1维。再通过另外两个置换然后再hash,又得到右边的另外两行,于是最终结果是每个document从7维降到了3维。我们来看看降维后的相似度情况,就是右下角那个表,给出了降维后的document两两之间的相似性。可以看出,还是挺准确的,回想一下刚刚说的:希望原来documents的Jaccard相似度高,那么它们的hash值相同的概率高,如果原来documents的Jaccard相似度低,那么它们的hash值不相同的概率高,如何进行概率上的保证?Min-Hashing有个惊人的性质: 就是说,对于两个document,在Min-Hashing方法中,它们hash值相等的概率等于它们降维前的Jaccard相似度。 注:在上述例子中,我们还可以采取欧氏距离等相似度量来替代Jaccard相似度,这时候LSH相应的策略也需要进行改变,从而使得最后的hash值等于降为前的相似度。作者:Poll的笔记博客出处:http://www.cnblogs.com/maybe2030/
2021年07月23日
4 阅读
0 评论
0 点赞
1
2
...
8