1.Python数据分析实战-实现T检验(附源码和实现效果)
2.Python实现KMeans(K-means Clustering Algorithm)
3.高效相似度计算:局部敏感哈希算法Locality Sensitive Hashing (LSH)
4.深入浅出KNN算法(原理解析+代码实现)
5.深度语义匹配模型DSSM及其变体CNN-DSSM,相似性源 LSTM-DSSM
Python数据分析实战-实现T检验(附源码和实现效果)
T检验是一种用于比较两个样本均值是否存在显著差异的统计方法。广泛应用于各种场景,码相例如判断两组数据是似性算法否具有显著差异。使用T检验前,相似性源需确保数据符合正态分布,码相并且样本方差具有相似性。似性算法弹弹岛战纪源码T检验有多种变体,相似性源包括独立样本T检验、码相配对样本T检验和单样本T检验,似性算法针对不同实验设计和数据类型选择适当方法至关重要。相似性源
实现T检验的码相Python代码如下:
python
import numpy as np
import scipy.stats as stats
# 示例数据
data1 = np.array([1, 2, 3, 4, 5])
data2 = np.array([2, 3, 4, 5, 6])
# 独立样本T检验
t_statistic, p_value = stats.ttest_ind(data1, data2)
print(f"T统计量:{ t_statistic}")
print(f"显著性水平:{ p_value}")
# 根据p值判断差异显著性
if p_value < 0.:
print("两个样本的均值存在显著差异")
else:
print("两个样本的均值无显著差异")
运行上述代码,将输出T统计量和显著性水平。似性算法根据p值判断,相似性源若p值小于0.,码相则可认为两个样本的似性算法均值存在显著差异;否则,认为两者均值无显著差异。
实现效果
根据上述代码,执行T检验后,得到的输出信息如下:
python
T统计量:-0.
显著性水平:0.
根据输出结果,T统计量为-0.,显著性水平为0.。由于p值大于0.,我们无法得出两个样本均值存在显著差异的结论。因此,可以判断在置信水平为0.时,两个样本的均值无显著差异。
Python实现KMeans(K-means Clustering Algorithm)
项目专栏:Python实现经典机器学习算法附代码+原理介绍
本篇文章旨在采用Python语言实现经典的机器学习算法K-means Clustering Algorithm,对KMeans算法进行深入解析并提供代码实现。KMeans算法是一种无监督学习方法,旨在将一组数据点划分为多个簇,基于数据点的相似性进行分类。
KMeans算法的优点包括简易性、实现效率以及对于大规模数据集的适应性。然而,它需要预先指定簇的交易论坛源码数量k,并且结果的稳定性受随机初始化的影响。此外,KMeans在处理非凸形状的簇和不同大小的簇时效果不佳。
实现K-means Clustering Algorithm,本文将重点讲述算法原理、优化方式及其Python实现,避开复杂细节,专注于算法核心流程,适合初学者理解。
### KMeans算法原理
KMeans算法的基本步骤如下:
1. 初始化k个随机簇中心。
2. 将每个数据点分配给最近的簇中心。
3. 更新簇中心为当前簇中所有点的平均值。
4. 重复步骤2和3,直至簇中心不再显著变化或达到预设迭代次数。
### KMeans算法优化方式
1. **快速KMeans**:通过提前选择初始簇中心或采用随机抽样,加速收敛。
2. **MiniBatchKMeans**:使用小批量数据进行迭代,减小计算复杂度,适用于大规模数据集。
### KMeans算法复杂度
时间复杂度通常为O(nki),其中n为数据点数量,k为聚类中心数量,i为迭代次数。实际应用中,加速计算可采用上述优化方法。
### KMeans算法实现
为了便于理解,本文提供一个简化版的KMeans算法实现,不使用sklearn直接封装的模型,而是手动实现KMeans的核心逻辑,以帮助初学者更好地掌握算法流程。
**1. 导包
**主要使用Python内置库进行实现。
**2. 定义随机数种子
**确保实验结果的可重复性,对于随机初始化和选择训练样本具有重要意义。
**3. 定义KMeans模型
**实现模型训练(fit)和预测(predict)方法。随便走源码
**3.3.1 模型训练
**通过不断迭代更新簇中心以最小化簇内方差。
**3.3.2 模型预测
**预测数据点所属簇,基于最近的簇中心。
**3.3.3 K-means Clustering Algorithm模型完整定义
**整合训练和预测方法,形成完整KMeans模型。
**3.4 导入数据
**使用自定义数据集,包含个样本,每个样本有个特征,7个类别。
**3.5 模型训练
**定义模型对象,指定k值,调用fit方法完成训练。
**3.6 可视化决策边界
**绘制样本的真实类别和KMeans划分后的类别,评估聚类效果。
通过可视化结果可以直观判断KMeans算法在数据集上的聚类性能。
### 完整源码
完整的KMeans算法Python代码实现,包括导入数据、模型训练、预测以及可视化决策边界的部分,旨在帮助读者理解KMeans算法的实现细节。
高效相似度计算:局部敏感哈希算法Locality Sensitive Hashing (LSH)
前言:最近工作接触文本相似度匹配的一些任务,对于使用的一些算法补下基础知识。
一、摘要
局部敏感哈希(LSH)是一种广泛应用于近似最近邻搜索(ANN)的技术。高效相似度搜索的解决方案是有利可图的,像谷歌、Netflix、亚马逊、Spotify、优步等大公司的许多核心功能都依赖于相似度搜索。例如亚马逊使用相似度搜索来比较用户,以相似度最高的用户,根据其历史购买记录来寻找新产品推荐。
二、美文网站源码背景
想象一个包含数百万甚至数十亿个样本的数据集,我们如何有效地比较所有这些样本?
即使在最好的硬件上,采用穷举法比较所有数据对是不可能的,这最多产生O(n²)的搜索复杂度。即使将单个查询与数十亿个样本进行比较,我们仍然产生最多为O(n)的搜索复杂度。此外还需要考虑单个相似性计算背后的复杂度。
怎样才能避免这种情况呢?
解决方案是近似搜索 ,不采用穷举搜索,而是 限制搜索范围,只搜索最相关的部分。
LSH是一种为我们提供亚线性搜索时间的算法。
三、算法简介
当我们考虑寻找相似向量对的复杂性时,我们发现即使在相当小的数据集上,比较所有东西所需的计算数量也是难以想象得大。这里引入 向量索引,如果我们想要将所有这些向量相互进行比较,最佳排序方法是对数线性时间复杂度。所以我们需要一种 减少比较次数 的方法。理想情况下,我们只想比较我们认为是潜在匹配的向量(候选对),局部敏感散(LSH)允许我们这样做。
LSH由多种不同的方法组成。在本文中,我们将介绍由多个步骤组成的传统方法——shingling、MinHashing和band的LSH函数。核心是允许对同一个样本进行分段和多次哈希,当一对向量至少被哈希到一次相同的值时,我们把它们标记为候选对(即潜在匹配的向量)。
典型的哈希函数旨在将不同的值放入不同的桶中,尽量减少多个键值被映射到同一个桶的可能性(即尽量减少哈希碰撞),LSH的哈希函数与其正好相反,希望将相似的数钱游戏源码值放入相同的桶中,实现最大化哈希碰撞(理想情况下只针对相似的输入,但不可避免地存在不相似的向量被标记为候选对进行minhash)。
在LSH中没有单一的哈希方法。事实上,它们都共享相同的“通过哈希函数的桶相似样本”逻辑,但它们可以有很大的不同。
四、三个步骤:Shingling, MinHashing, Band and LSH
本文探索LSH的方法包括三个步骤。首先,我们使用k-shingling(和one-hot编码)将文本转换为稀疏向量,然后使用minhashing创建“签名”,最后将签名向量传递给LSH环节以淘汰候选对。
4.1 k-Shingling
定义:k-Shingling(简称shingling)将一串文本转换为一组“shingles”的过程。这个过程类似于在我们的文本字符串中移动一个长度为k的窗口,并将每一步移动获取的k个字符 整理成去重的“shingle set”。
4.2 Minhashing
定义:在保持相相似度的情况下,Minhashing通过哈希函数将稀疏的one-hot编码向量映射到密集向量(minhash签名向量)。有了稀疏向量,我们所做的是为我们密集向量中的每个签名位置分配不同的minhash函数将稀疏向量映射到signature。
Min Hashing算法解决了前面所说的计算复杂度:它通过将向量A、B映射到低维空间中的两个签名向量,并且近似保持A、B之间的相似度,降低了用户相似度在高维下的计算复杂度。
4.3 Band 和 Hash
我们将对LSH采用banding方法——它将获取我们的签名,对每个签名的片段进行哈希,并查找哈希冲突,将具有一些相似性的签名哈希到同一桶中,从而将其标识为候选对。
定义:banding方法通过将密集向量分成b个子向量,通过相同的哈希函数处理每个子向量并映射到一个哈希桶中,两个向量的子向量匹配,我们将各自的完整向量视为候选对。
例如,想象一下,我们把一个维的向量分成个片段,这给了我们次机会来识别两个向量之间匹配的子向量。但这也增加了误报的数量(我们标记为候选对的样本,它们实际并不相似),但是我们会尽量减少这些问题。
五、优化Bands
假设我们将signature向量分为[公式] 个band,每个band的大小为 [公式] ,两个用户向量之间的Jaccard相似度为 [公式] :
这个概率在[公式] 和 [公式] 取不同值时总是一个S形的曲线(这个S形曲线的特点在于,当 [公式] 超过一个阈值之后,两个用户成为candidate的概率会迅速增加并接近于1。这个阈值就是概率变化最陡的地方,近似为[公式] );
上面的例子中[公式] , [公式] ,可视化当前的概率值 [公式] -是否候选集 [公式] 之间的关系,我们注意到一个模式:虽然这种对齐并不完美,但我们可以看到理论计算的概率 [公式] 与真正的候选配对结果之间的相关性。
现在,我们可以通过修改[公式] 来推测具有不同相似性分数的候选对的返回概率,通过优化 [公式] 值来移动LSH函数的相似性阈值。
增加[公式] 值提供更多的子向量部分哈希碰撞的可能性更大,返回更多的候选对,将导致更多的误报(FP),也会减少一些漏网之鱼(FN).
六、源码
Github源码: github.com/topics/local...
Scala中基于Jaccard 距离的LSH相似度计算代码: spark.apache.org/docs/3...
七、参考
参考: Locality Sensitive Hashing (LSH): The Illustrated Guide | Pinecone
参考: hunter7z:大规模数据的相似度计算:LSH算法
参考: allen:一文纵览KNN(ANN)向量检索
深入浅出KNN算法(原理解析+代码实现)
KNN算法,即K最邻近算法,是一种基于“相似性”进行分类的简单方法。它通过比较样本间的“距离”来决定其类别归属,与K-means聚类算法有所区别,前者是监督学习,后者是无监督学习。KNN的核心思想是“物以类聚,人以群分”,即样本的分类取决于与其最邻近的K个已知样本的类别倾向。
衡量距离是KNN的关键,常用的距离度量包括欧氏距离、明可夫斯基距离、曼哈顿距离、切比雪夫距离和马氏距离。这些距离公式根据参数的不同,定义了不同类型的距离。KNN的决策过程是,新样本的类别由其与K个最邻近训练样本中类别分布最多的类别决定,但实际决策时,需要考虑距离的加权影响,即距离近的样本权重更大。
以下是一个简单的代码实现示例,假设我们有一个数据集(部分展示):
数据集(示例):
源码(简化版):
在这个代码片段中,会根据数据集中的距离计算出K个最近邻,然后根据加权原则确定新样本的类别。这段代码展示了KNN算法的具体应用过程。
深度语义匹配模型DSSM及其变体CNN-DSSM, LSTM-DSSM
在研究推荐和排序算法的过程中,DSSM(深度结构语义模型)是不可或缺的一部分。本文将详细介绍DSSM及其变体CNN-DSSM和LSTM-DSSM。
论文链接:microsoft.com/en-us/res...
源码:github.com/baharefatemi...
简介
现代搜索引擎在检索文章时,通常将文章中的关键字与query中的内容进行比较。然而,这种做法存在一个问题,即文字具有多义性,同样的含义可以用多种表达方式进行表达。因此,我们需要对query和document进行语义上的相似度匹配。
通常,我们会使用隐语义模型LSA、LDA来衡量Query和Document之间的相似性。然而,由于LSA、LDA是无监督学习的模型,这些模型的效果并不符合预期。基于隐语义模型,有两种扩展:第一种是使用BLTM结合DPM来拟合query和document之间的关系,另一种方法是采用深度模型对query和document进行自编码,但这两种方法都是无监督的方法。
本文针对搜索场景,提出了一系列深度网络语义模型(Deep Structured Semantic Models),模型的核心思想是:首先将query和document映射到同一个低维语义空间,然后通过cosine来计算query和document之间的距离。与之前的无监督学习模型不同,DSSM使用document的点击量进行训练,因此DSSM的效果要优于其他无监督模型。
接下来,我们来看看DSSM是如何对query和document进行处理的。
DSSM的结构采用DNN结构,将输入的query和document转换到低维的语义空间,然后计算他们的cosine相似度。
语义特征计算部分,首先使用DNN网络将query和document从高维的空间转换到低维的空间。对输入的query和document假设他们是x,经过转换的向量为y,[公式]表示隐藏层,[公式]分别表示隐藏层的参数和偏置。
最后一层采用tanh函数作为激活函数。最后将query和document映射到低维向量之后,我们采用cosine计算他们的相似度。
为了解决query和document在第一层维度非常大的问题,本文提出了word hashing的方法,来对文本进行降维。做法就是使用n-gram来表示一个词语,例如good,我们把它拆分成trigram:go goo ood od。
为了训练DSSM,我们需要得到query和他们对应的点击的document。作者假设如果用户点击了某个document,那么这个query和document就是相关的。因此,作者认为DSSM的目标是最大化给定query所对应的document的条件似然函数。条件似然函数的计算方式为:[公式]。其中,[公式]是平滑参数,D是针对query的所有可能相关的document集合,[公式]表示和query有关的且用户点击的document。
有了以上的介绍,我们所要最大化的条件似然函数就是[公式]。因此,loss函数就是:[公式]。文中作者采用梯度下降法来最大化loss函数。
作者收集了现实生活中用户搜索的日志作为实验的数据集,这份数据包含条用户query,平均每条query包含条url。每一个(query, document)的相关性分为5档,分别是0~4分,得分是人工评价的。模型的排序效果通过NDCG来衡量,这是推荐系统常见的评价指标,具体就是评价推荐给用户的内容是否是用户感兴趣的,而用户的阅读习惯一般是从上到下,所以我们希望将最相关的内容排在前面,然后以此类推。
实验效果如下,其中:首先我们可以看出DSSM的效果优于其他模型,并且L-WH DNN的效果是最好的。
DSSM是搜索里非常经典的一个算法,在工业界也广泛被使用。而且,根据应用场景的不同,对特征处理也会有一些区别。例如,在推荐召回模块的应用中,我们的输入可能就不再是query和doc的word embedding,而是用户和推荐的物品(例如**,商品)的特征。
本文依然是由DSSM的作者提出,在语义特征计算部分采用CNN网络,网络结构如上图所示。在词向量的表达上依然采用了word hash(不知道为啥作者对word hash这么执着)。
不过,trigram表示不能忽略了文本的上下文信息,因此作者在word trigram的基础上增加了letter trigram。在一定的窗口大小内,对该窗口内的word进行拼接就是letter trigram,例如I have an apple,可以被拼接为 # I have, I have an, ... 以此类推。
然后以上表示经过卷积层,max-pooling,和全连接之后得到query和doc的低维向量。最后计算相似度的时候还是cosine距离。
本文针对CNN-DSSM无法捕捉长文本的上下文信息的缺点,引入了LSTM。同时在LSTM的cell中加入了peehole,LSTM的cell结构如上图所示。
与传统的LSTM不同,作者在遗忘门、输入门、输出门中都考虑了[公式],总体来说考虑的信息更丰富。