精华内容
下载资源
问答
  • 一般三角形设三角形三边为AC,BC,AB,点D垂直于AB,为三角形ABC的高如图,利用勾股定理,得AC2-AD2=CD2① CB2-BD2=CD2②①=②AC2-AD2=CB2-BD2因为 AD+BD=AB所以 AC2-(AB-BD)2=CB2-BD2③同样也有AC2-AD2=CB2-(AB-AD)2④...

    一般三角形

    设三角形三边为AC,BC,AB,

    点D垂直于AB,为三角形ABC的高

    如图,利用勾股定理,得

    AC2-AD2=CD2① CB2-BD2=CD2②

    ①=②

    AC2-AD2=CB2-BD2

    因为 AD+BD=AB

    所以 AC2-(AB-BD)2=CB2-BD2③

    同样也有AC2-AD2=CB2-(AB-AD)2④

    ③化简得:(AB2+CB2-AC2)÷2AB=BD

    ④化简得:(AB2-CB2+AC2)÷2AB=AD

    直角三角形

    性质1:直角三角形两直角边的平方和等于斜边的平方。

    性质2:在直角三角形中,两个锐角互余。

    性质3:在直角三角形中,斜边上的中线等于斜边的一半。

    性质4:直角三角形的两直角边的乘积等于斜边与斜边上高的乘积。

    性质5:如图,Rt△ABC中,∠BAC=90°,AD是斜边BC上的高,则有射影定理如下:

    (1) AD^2=BD·DC,

    (2) AB^2=BD·BC , 射影定理图

    (3) AC^2=CD·BC 。 等积式

    (4)AB*AC=AD*BC (可用面积来证明)

    (5)直角三角形的外接圆的半径R=1/2BC,

    (6)直角三角形的内切圆的半径r=1/2(AB+AC-BC)(公式一);r=AB*AC/(AB+BC+CA)(公式二)

    等腰直角三角形三边之比:1:1:根号二

    ============================

    三角函数公式

    sin30°=1/2 sin45°=√2/2 sin60°=√3/2

    cos30°=√3/2 cos45°=√2/2 cos60°=1/2

    tan30°=√3/3 tan45°=1 tan60°=√3

    cot30°=√3 cot45°=1 cot60°=√3/3

    sin15°=(√6-√2)/4 sin75°=(√6+√2)/4 cos15°=(√6+√2)/4

    cos75°=(√6-√2)/4(这四个可根据sin(45°±30°)=sin45°cos30°±cos45°sin30°得出)

    sin18°=(√5-1)/4 (这个值在高中竞赛和自招中会比较有用,即黄金分割的一半)

    正弦定理:在△ABC中,a / sinA = b / sin B = c / sin C = 2R (其中,R为△ABC的外接圆的半径。)

    三角函数的诱导公式(六公式)

    公式一:

    sin(α+k*2π)=sinα cos(α+k*2π)=cosα tan(α+k*2π)=tanα

    公式二:

    sin(π+α) = -sinα cos(π+α) = -cosα tan(π+α)=tanα

    公式三:

    sin(-α) = -sinα cos(-α) = cosα tan (-α)=-tanα

    公式四:

    sin(π-α) = sinα cos(π-α) = -cosα tan(π-α) =-tanα

    公式五:

    sin(π/2-α) = cosα cos(π/2-α) =sinα

    由于π/2+α=π-(π/2-α),由公式四和公式五可得

    公式六:

    sin(π/2+α)= cosα cos(π/2+α) = -sinα sin(π/2+α)= cosα

    cos(π/2+α)= -sinα tan(π/2+α)= -cotα cot(π/2+α)= -tanα

    sin(π/2-α)= cosα cos(π/2-α)= sinα tan(π/2-α)= cotα

    cot(π/2-α)= tanα sin(3π/2+α)= -cosα cos(3π/2+α)= sinα

    tan(3π/2+α)= -cotα cot(3π/2+α)= -tanα sin(3π/2-α)= -cosα

    cos(3π/2-α)= -sinα tan(3π/2-α)= cotα cot(3π/2-α)= tanα

    诱导公式记背诀窍:奇变偶不变,符号看象限。

    和(差)角公式

    三角和公式

    sin(α+β+γ)=sinα·cosβ·cosγ+cosα·sinβ·cosγ+cosα·cosβ·sinγ-sinα·sinβ·sinγ

    cos(α+β+γ)=cosα·cosβ·coscγ-osα·sinβ·sinγ-sinα·cosβ·sinγ-sinα·sinβ·cosγ

    tan(α+β+γ)=(tanα+tanβ+tanγ-tanα·tanβ·tanγ)/(1-tanα·tanβ-tanβ·tanγ-tanα·tanγ)

    (α+β+γ≠π/2+2kπ,α、β、γ≠π/2+2kπ)

    积化和差的四个公式

    sina*cosb=(sin(a+b)+sin(a-b))/2

    cosa*sinb=(sin(a+b)-sin(a-b))/2

    cosa*cosb=(cos(a+b)+cos(a-b))/2

    sina*sinb=-(cos(a+b)-cos(a-b))/2

    和差化积的四个公式:

    sinx+siny=2sin((x+y)/2)*cos((x-y)/2)

    sinx-siny=2cos((x+y)/2)*sin((x-y)/2)

    cosx+cosy=2cos((x+y)/2)*cos((x-y)/2)

    cosx-cosy=-2sin((x+y)/2)*sin((x-y)/2)

    展开全文
  • 通用勾股定理求解

    2020-03-10 00:28:38
    通用勾股定理求解,张胜持,,本文提出了一套勾股定理的通用多项式求解方法,只要指定勾为任意一个自然数,就能够直接代入相关公式计算出全部股和弦的值,是一
  • 查看本章节 查看作业目录 需求说明: 使用JavaScript 中的Math对象和勾股定理公式,计算鼠标的位置与页面图片中心点的距离,根据距离对页面上的图片进行放大或缩小处理。... 使用勾股定理计算出鼠标

    查看本章节

    查看作业目录


    需求说明:

    使用JavaScript 中的Math对象和勾股定理公式,计算鼠标的位置与页面图片中心点的距离,根据距离对页面上的图片进行放大或缩小处理。距离远时图片放大,距离近时图片缩小

    • 随着鼠标的移动,实时计算鼠标与图片中心点的距离,在输入框中显示图片的缩放系数
    • 放大倍数不超过3 倍,缩小不小于50%

    实现思路:

    1. 在页面上编写输入框用于显示缩放系数,并使用<img>标签显示一幅图片
    2. 获取图片中心点的坐标
    3. 获取鼠标移动时的坐标
    4. 使用勾股定理计算出鼠标与图片中心点之间的距离
    5. 将距离转换为缩放系数并显示在输入框中
    6. 根据缩放系数改变<img> 标签的宽度和高度

    实现代码:

    
    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="UTF-8">
    		<title></title>
    		<style type="text/css">
    			#div{
    				width: 100%;
    				position: absolute;
    				bottom: 0;
    				text-align: center;
    			}
    			img{
    				width: 300px;
    		     	height: 150px;
    		    }
    			input{
    				text-align: center;
    				position: absolute;
    			}
    		</style>
    	</head>
    	<body>
    		<script type="text/javascript">
    			window.onload=function(){
    				var input=document.getElementById("input");
    				var div=document.getElementById("div");
    				var img=document.getElementById("img");
    				window.onmousemove=function(){
    					var x=img.offsetLeft + img.offsetWidth/2;
    					console.log(x)
    					var y=img.offsetTop + img.offsetHeight/2;
    					console.log(y)
    					var b=event.clientX-x;
    					var a=event.clientY-y;
    					var c=Math.sqrt(Math.pow(b,2)+Math.pow(a,2));
    					var scale=Math.floor(c)/100-1;
    					if (scale<0.5) {
    						scale=0.5;
    					} else if(scale>3){
    						scale=3;
    					}
    					input.value=scale;
    					img.style.width=scale*300+"px";
    					img.style.height=scale*150+"px";
    				};
    			};
    		</script>
    		<p>图片缩放系数:<input type="text" id="input"/></p>
    		<div id="div">
    			<img src="img/img_1.jpg"  id="img"/>
    		</div>
    	</body>
    </html>
    

     

    展开全文
  • 好吧,在毕达哥拉斯定理中,您需要斜边是最长的长度。我能够对我的数组进行排序,它会自动将我的值...使用有序数组来解决勾股定理(Python)下面是可以对值进行排序的代码。#result3, result2, result are leg measure...

    好吧,在毕达哥拉斯定理中,您需要斜边是最长的长度。我能够对我的数组进行排序,它会自动将我的值从最小到最大排列。现在,问题是我该如何处理这些值?程序中的用户不知道什么是最长的长度(用户输入坐标),计算机绘制三个点并使用距离公式来查看三面之间的长度。使用有序数组来解决勾股定理(Python)

    下面是可以对值进行排序的代码。

    #result3, result2, result are leg measurements

    brandonarray[result3,result2,result]

    brandonarray.sort(key=int)

    因此,举例来说,如果用户积3个随机点(允许使用(3,5),(10,10),(19,20)) 我提出的程序打印阵列距离数。

    #result3 was 8, result2 was 13, result was 21

    [8,13,21]

    如果我插入这三个数字,我知道它会工作。我做了这个程序,告诉你这些腿的尺寸会让它变成斜角,它是一个钝角三角形。

    但是如果用户在不注意边长的情况下提出了要点呢?

    #all of these are strings b/c in the beginning of program, user has input

    joe=str(float(result3)**int(2))

    sally=str(float(result2)**int(2))

    print(str(float(result3)**int(2)),"+",float(result2)**int(2),"=",float(result)**int(2))

    print("")

    print(str(float(joe)+float(sally)),"=",str(float(result)**int(2)))

    #this code no matter what, will take the number its assigned too, regardless if its bigger than the hypotenuse

    if(str(float(joe)+float(sally))>str(float(result)**int(2))):

    print("This is an acute triangle!")

    elif(str(float(joe)+float(sally))

    print("This is an obtuse triangle!")

    elif(str(float(joe)+float(sally))==str(float(result)**int(2))):

    print("This is an right triangle!")

    什么我真的问的是我怎么可以使用数组由上述可见,并落实到勾股定理,从最小的值最大。非常感谢您的帮助!

    2017-03-07

    PYRO 912

    +1

    转码过多浮点数 int str在您的代码中。你应该能够删除其中的大部分。 –

    +1

    特别是,'int(2)'是一个no-op。 –

    +2

    'brandonarray [result3,result2,result]'?你的意思是'brandonarray = [result3,result2,result]'? –

    展开全文
  • 然而实践的过程中,又发现数学知识的理解深度有些欠缺,在理解一些公式背后的意义时,有些力不从心的感觉。因此梳理了一些数学上的知识盲点,理顺自己的知识脉络,顺便分享给有需要的人。 本文主要讲解余弦相似度的...

    大部分程序员由于理工科的背景,有一些高数、线性代数、概率论与数理统计的数学基础。所以当机器学习的热潮来临的时候,都跃跃欲试,对机器学习的算法以及背后的数学思想有比较强烈的探索欲望。

    本文的作者就是其中的一位。然而实践的过程中,又发现数学知识的理解深度有些欠缺,在理解一些公式背后的意义时,有些力不从心的感觉。因此梳理了一些数学上的知识盲点,理顺自己的知识脉络,顺便分享给有需要的人。

    本文主要讲解余弦相似度的相关知识点。相似度计算用途相当广泛,是搜索引擎、推荐引擎、分类聚类等业务场景的核心点。为了理解清楚余弦相似度的来龙去脉,我将会从最简单的初中数学入手,逐步推导出余弦公式。然后基于余弦公式串讲一些实践的例子。

    一、业务背景

    通常我们日常开发中,可能会遇到如下的业务场景。

    72d480921a9a0d97f28db63b10ecd406.png

    精准营销,图像处理,搜索引擎 这三个看似风马牛不相及的业务场景,其实面临一个共同的问题就是相似度的计算。例如精准营销中的人群扩量涉及用户相似度的计算;图像分类问题涉及图像相似度的计算,搜索引擎涉及查询词和文档的相似度计算。相似度计算中,可能由于《数学之美》的影响,大家最熟悉的应该是余弦相似度。那么余弦相似度是怎么推导出来的呢?

    二、数学基础

    理解余弦相似度,要从理解金字塔开始。我们知道金字塔的底座是一个巨大的正方形。例如吉萨大金字塔的边长超过230m。构造这样一个巨大的正方形,如何保证构造出来的图形不走样呢?比如如何确保构造的结果不是菱形或者梯形。

    ba1c64c72b25a868e54d139bfc864cae.png

    1、勾股定理

    要保证构造出来的四边形是正方形,需要保证两个点:其一是四边形的边长相等;其二是四边形的角是直角。四边形的边长相等很容易解决,在工程实践中,取一根定长的绳子作为边长就可以了。如何保障直角呢?古人是利用勾股定理解决的,更切确地说是勾股定理的逆定理。

    构造一个三角形,保证三角形的三边长分别是3,4,5。那么边长为5的边对应的角为直角。中国有个成语“无规矩不成方圆”,其中的矩,就是直角的尺。

    c24fce57bce1aa0b0e0990d368b60ee9.png

    勾股证明是初中数学的知识,理解很容易。证明也很简单,据说爱因斯坦11岁就发现了一种证明方法。勾股定理的证明方法据统计有超过400种, 感兴趣的同学可以自行了解。另勾股定理也是费马大定理的灵感来源,费马大定理困扰了世间智者300多年,也诞生了很多的逸闻趣事,这里不赘述。

    2、余弦定理

    勾股定理存在着一个很大的限制,就是要求三角形必须是直角三角形。那么对于普通的三角形,三个边存在什么样的关系呢?这就引出了余弦定理。

    853365e92a13f85fae4658c5e321d7e8.png

    余弦定理指出了任意三角形三边的关系,也是初中就可以理解的数学知识,证明也比较简单,这里就略过了。

    其实对于三角形,理解了勾股定理和余弦定理。就已经掌握了三角形的很多特性和秘密了。比如根据等边三角形,可以推导出cos(60)=1/2。但是如果想理解几何更多的秘密,就需要进入解析几何的世界。这个数学知识也不算很高深,高中数学知识。

    这里我们理解最简单就可以了,那就是三角形在直角坐标系中的表示。所谓“横看成岭侧成峰,远近高低各不同”,我们可以理解为三角形的另一种表现形式。

    6502426cb0b5061034f236b8efc108ed.png

    比如我们可以用a,b,c三个边描述一个三角形;在平面直角坐标系中,我们可以用两个向量表示一个三角形。

    3、余弦相似度

    当我们引入了直角坐标系后,三角形的表示就进入了更灵活、更强大和更抽象的境界了。几何图形可以用代数的方法来计算,代数可以用几何图形形象化表示,大大降低理解难度。比如我们用一个向量来表示三角形的一个边,就可以从二维空间直接扩展到高维空间。

    bbd87f7b4470f3c90a7dce147e68450b.png

    这里,向量的定义跟点是一样的;向量的乘法也只是各个维度值相乘累加;向量的长度看似是新的东西,其实绕了一个圈,本质上还是勾股定理,只是勾股定理从二维空间扩展到了N维空间而已。而且向量长度又是两个相同向量乘法的特例。数学的严谨性在这里体现得淋漓尽致。

    结合勾股定理,余弦定理,直角坐标系,向量。我们就可以很自然地推导出余弦公式了,这里唯一的理解难点就是勾股定理和余弦定理都是用向量来表示。

    b1fc6152ff4c8d41fb83e1684030de54.png

    得到了余弦公式后,我们该怎么理解余弦公式呢?

    ea7dbef7875dc8a0d1e23a78686e7f5f.png

    极端情况下,两个向量重合了,就代表两个向量完全相似。然而这里的完全相似,其实是指向量的方向。向量有方向和长度两个要素,这里只使用方向这一个要素,在实践中就埋下了隐患。但是毕竟一个数学模型建立起来了。我们可以用这个模型解决一些实际中的问题了。

    所谓数学模型,有可能并不需要高深的数学知识,对外的表现也仅仅是一个数学公式。比如余弦定理这个数学模型,高中数学知识就足够理解了。而且关于模型,有这样一个很有意思的论述:“所有的数学模型都是错的,但是有些是有用的”。这里我们更多关注其有用的一面。

    理解了向量夹角,那么该怎么理解向量呢?它仅仅是三角形的一条边吗? 

    d3a5e5fe2fe37fe8f75d1d126eb3ac70.png

     

    人生有几何,万物皆向量。向量在数学上是简单的抽象,这个抽象我们可以用太多实际的场景来使它落地。比如用向量来指代用户标签,用向量来指代颜色,用向量来指代搜索引擎的逻辑...

    三、业务实践

    理解了余弦定理,理解了数学建模的方式。接下来我们就可以做一些有意思的事情了。比如前面提到的三个业务场景,我们可以看看如何用余弦相似度来解决。当然实际问题肯定远远要复杂得多,但是核心的思想都是类似的。

    案例1:精准营销

    假设一次运营计划,比如我们圈定了1w的用户,如何扩展到10万人呢?

    5e6131e7d54f56bac6c7cb1d9ec00dc1.png

    利用余弦相似度,我们这里其实最核心的问题就是:如何将用户向量化?

    将每个用户视为一个向量,用户的每个标签值视为向量的一个维度。当然这里实际工程中还有特征归一化,特征加权等细节。我们这里仅作为演示,不陷入到细节中。

    对于人群,我们可以取人群中,所有用户维度值的平均值,作为人群向量。这样处理后,就可以使用余弦公式计算用户的相似度了。

    e8bf306d95f3ed4a0380a1d505692ab3.png  

    我们通过计算大盘用户中每个用户跟圈定人群的相似度,取topN即可实现人群的扩量。

    直接“show me the code”吧! 

    # -*- coding: utf-8 -*-
    import numpy as np
    import numpy.linalg as linalg
     
     
    def cos_similarity(v1, v2):
        num = float(np.dot(v1.T, v2))  # 若为行向量则 A.T * B
        denom = linalg.norm(v1) * linalg.norm(v2)
        if denom > 0:
            cos = num / denom  # 余弦值
            sim = 0.5 + 0.5 * cos  # 归一化
            return sim
        return 0
     
     
    if __name__ == '__main__':
     
        u_tag_list = [
            ["女", "26", "是", "白领"],
            ["女", "35", "是", "白领"],
            ["女", "30", "是", "白领"],
            ["女", "22", "是", "白领"],
            ["女", "20", "是", "白领"]
        ]
        new_user = ["女", "20", "是", "白领"]
     
        u_tag_vector = np.array([
            [1, 26, 1, 1],
            [1, 35, 1, 1],
            [1, 30, 1, 1],
            [1, 22, 1, 1],
            [1, 20, 1, 1]
        ])
     
        c1 = u_tag_vector[0]
        c1 += u_tag_vector[1]
        c1 += u_tag_vector[2]
        c1 += u_tag_vector[3]
        c1 += u_tag_vector[4]
        c1 = c1/5
         
        new_user_v1 = np.array([1, 36, 1, 1])
        new_user_v2 = np.array([-1, 20, 0, 1])
        print("vector-u1: ", list(map(lambda x: '%.2f' % x, new_user_v1.tolist()[0:10])))
        print("vector-u2: ", list(map(lambda x: '%.2f' % x, new_user_v2.tolist()[0:10])))
        print("vector-c1: ", list(map(lambda x: '%.2f' % x, c1.tolist()[0:10])))
        print("sim<u1,c1>: ", cos_similarity(c1, new_user_v1))
        print("sim<u2,c1>: ", cos_similarity(c1, new_user_v2))

    案例2:图像分类

    有两类图片,美食和萌宠。对于新的图片,如何自动分类呢? 

    a3d78d1fd916aebc522778a68036d34a.png  

    这里我们的核心问题是:图片如何向量化?

    图片由像素构成,每个像素有RGB三个通道。由于像素粒度太细,将图片分割成大小相对的格子,每个格子定义3个维度,维度值取格子内像素均值。

    ae307a80848e48ce8eab9ad3f445bc0c.png

    参考博客: 图像基础7 图像分类——余弦相似度

    下面也是给出样例代码:

    # -*- coding: utf-8 -*-
    import numpy as np
    import numpy.linalg as linalg
    import cv2
     
     
    def cos_similarity(v1, v2):
        num = float(np.dot(v1.T, v2))  # 若为行向量则 A.T * B
        denom = linalg.norm(v1) * linalg.norm(v2)
        if denom > 0:
            cos = num / denom  # 余弦值
            sim = 0.5 + 0.5 * cos  # 归一化
            return sim
        return 0
     
     
    def build_image_vector(im):
        """
     
        :param im:
        :return:
        """
        im_vector = []
     
        im2 = cv2.resize(im, (500, 300))
        w = im2.shape[1]
        h = im2.shape[0]
        h_step = 30
        w_step = 50
     
        for i in range(0, w, w_step):
            for j in range(0, h, h_step):
                each = im2[j:j+h_step, i:i+w_step]
                b, g, r = each[:, :, 0], each[:, :, 1], each[:, :, 2]
                im_vector.append(np.mean(b))
                im_vector.append(np.mean(g))
                im_vector.append(np.mean(r))
        return np.array(im_vector)
     
     
    def show(imm):
        imm2 = cv2.resize(imm, (510, 300))
        print(imm2.shape)
        imm3 = imm2[0:50, 0:30]
        cv2.imshow("aa", imm3)
     
        cv2.waitKey()
        cv2.destroyAllWindows()
        imm4 = imm2[51:100, 0:30]
        cv2.imshow("bb", imm4)
        cv2.waitKey()
        cv2.destroyAllWindows()
        imm2.fill(0)
     
     
    def build_image_collection_vector(p_name):
        path = "D:\\python-workspace\\cos-similarity\\images\\"
     
        c1_vector = np.zeros(300)
        for pic in p_name:
            imm = cv2.imread(path + pic)
            each_v = build_image_vector(imm)
            a=list(map(lambda x:'%.2f' % x, each_v.tolist()[0:10]))
            print("p1: ", a)
            c1_vector += each_v
        return c1_vector/len(p_name)
     
     
    if __name__ == '__main__':
     
        v1 = build_image_collection_vector(["food1.jpg", "food2.jpg", "food3.jpg"])
        v2 = build_image_collection_vector(["pet1.jpg", "pet2.jpg", "pet3.jpg"])
     
        im = cv2.imread("D:\\python-workspace\\cos-similarity\\images\\pet4.jpg")
        v3 = build_image_vector(im)
        print("v1,v3:", cos_similarity(v1,v3))
        print("v2,v3:", cos_similarity(v2,v3))
        a = list(map(lambda x: '%.2f' % x, v3.tolist()[0:10]))
        print("p1: ", a)
        im2 = cv2.imread("D:\\python-workspace\\cos-similarity\\images\\food4.jpg")
        v4 = build_image_vector(im2)
     
        print("v1,v4:", cos_similarity(v1, v4))
        print("v2,v4:", cos_similarity(v2, v4))

    至于代码中用到的图片,用户可以自行收集即可。笔者也是直接从搜索引擎中截取的。程序计算的结果也是很直观的,V2(萌宠)跟图像D1的相似度为0.956626,比V1(美食)跟图像D1的相似度0.942010更高,所以结果也是很明确的。

    be2bf8180739a618e755f3390d332780.png

    案例3:文本检索

    假设有三个文档,描述的内容如下。一个是疫情背景下,苹果公司的资讯,另外两个是水果相关的信息。输入搜索词“苹果是我最喜欢的水果”,  该怎么找到最相关的文档?

    78ab9a4884306a6927887f29095f865e.png

    这里的核心问题也是文本和搜索词如何向量化?

    这里其实可以把搜索词也视为文档,这样问题就简化成:文档如何向量化?

    出于简化问题的角度,我们可以给出最简单的答案:文档由词组成,每个词作为一个维度;文档中词出现的频率作为维度值。

    当然,实际操作时我们维度值的计算会更复杂一些,比如用TF-IDF。这里用词频(TF)并不影响演示效果,所以我们从简。

    将文本向量化后,剩下也是依样画葫芦,用余弦公式计算相似度, 流程如下:

    786d5b8c053848b137cb6208ba6d73ba.png

    最后,给出代码:

    # -*- coding: utf-8 -*-
    import numpy as np
    import numpy.linalg as linalg
    import jieba
     
     
    def cos_similarity(v1, v2):
        num = float(np.dot(v1.T, v2))  # 若为行向量则 A.T * B
        denom = linalg.norm(v1) * linalg.norm(v2)
        if denom > 0:
            cos = num / denom  # 余弦值
            sim = 0.5 + 0.5 * cos  # 归一化
            return sim
        return 0
     
     
    def build_doc_tf_vector(doc_list):
        num = 0
        doc_seg_list = []
        word_dic = {}
        for d in doc_list:
            seg_list = jieba.cut(d, cut_all=False)
            seg_filterd = filter(lambda x: len(x)>1, seg_list)
     
            w_list = []
            for w in seg_filterd:
                w_list.append(w)
                if w not in word_dic:
                    word_dic[w] = num
                    num+=1
     
            doc_seg_list.append(w_list)
     
        print(word_dic)
     
        doc_vec = []
     
        for d in doc_seg_list:
            vi = [0] * len(word_dic)
            for w in d:
               vi[word_dic[w]] += 1
            doc_vec.append(np.array(vi))
            print(vi[0:40])
        return doc_vec, word_dic
     
     
    def build_query_tf_vector(query, word_dic):
        seg_list = jieba.cut(query, cut_all=False)
        vi = [0] * len(word_dic)
        for w in seg_list:
            if w in word_dic:
                vi[word_dic[w]] += 1
        return vi
     
     
    if __name__ == '__main__':
        doc_list = [
            """
             受全球疫情影响,3月苹果宣布关闭除大中华区之外数百家全球门店,其庞大的供应链体系也受到冲击,
             尽管目前富士康等代工厂已经开足马力恢复生产,但相比之前产能依然受限。中国是iPhone生产的大本营,
             为了转移风险,iPhone零部件能否实现印度制造?实现印度生产的最大难点就是,相对中国,印度制造业仍然欠发达
            """,
            """
            苹果是一种低热量的水果,每100克产生大约60千卡左右的热量。苹果中营养成分可溶性大,容易被人体吸收,故有“活水”之称。
            它有利于溶解硫元素,使皮肤润滑柔嫩。
            """,
            """
            在生活当中,香蕉是一种很常见的水果,一年四季都能吃得着,因其肉质香甜软糯,且营养价值高,所以深受老百姓的喜爱。
            那么香蕉有什么具体的功效,你了解吗?
            """
        ]
     
        query = "苹果是我喜欢的水果"
     
        doc_vector, word_dic = build_doc_tf_vector(doc_list)
     
        query_vector = build_query_tf_vector(query, word_dic)
     
        print(query_vector[0:35])
     
        for i, doc in enumerate(doc_vector):
            si = cos_similarity(doc, query_vector)
            print("doc", i, ":", si)

    我们检索排序的结果如下:

    文档D2是相似度最高的,符合我们的预期。这里我们用最简单的方法,实现了一个搜索打分排序的样例,虽然它并没有实用价值,但是演示出了搜索引擎的工作原理。

    四、超越余弦

    前面通过简单的3个案例,演示了余弦定理的用法,但是没有完全释放出余弦定理的洪荒之力。接下来展示一下工业级的系统中是如何使用余弦定理的。这里选取了开源搜索引擎数据库ES的内核Lucene作为研究对象。研究的问题是:Lucene是如何使用余弦相似度进行文档相似度打分?

    当然,对于Lucene的实现,它有另一个名字:向量空间模型。即许多向量化的文档集合形成了向量空间。我们首先直接看公式:

    很明显,实际公式跟理论公式长相差异很大。那么我们怎么理解呢?换言之,我们怎么基于理论公式推导出实际公式呢?

    首先需要注意的是,在Lucene中,文档向量的特征不再是我们案例3中展示的,用的词频,而是TF-IDF。关于TF-IDF相关的知识,比较简单,主要的思路在于:

    如何量化一个词在文档中的关键程度?  TF-IDF给出的答案是综合考虑词频(词在当前文档中出现的次数)以及逆文档频率(词出现的文档个数)两个因素。

    1. 词在当前文档中出现次数(TF)越多,  词越重要
    2. 词在其他文档出现的次数(IDF)越少,词越独特

    感兴趣的话,可以自行参考其他资料,这里不展开说明。

    回到我们的核心问题: 我们怎么基于理论公式推导出实际公式呢?

    四步走就可以了,如下图:

    第一步:计算向量乘法

    向量乘法就是套用数学公式了。这里需要注意的是,这里有两个简化的思想:

    1. 查询语句中不存在的词tf(t,q)=0
    2. 查询语句基本没有重复的词tf(t,q)=1

    所以我们比较简单完成了第一步推导:

    第二步: 计算查询语句向量长度|V(q)|

    计算向量长度,其实就是勾股定理的使用了。只不过这里是多维空间的勾股定理。

    这里取名queryNorm, 表示这个操作是对向量的归一化。这个其实是当向量乘以queryNorm后,就变成了单位向量。单位向量的长度为1,所以称为归一化,也就是取名norm。理解了这一层,看lucene源码的时候,就比较容易理解了。这正如琅琊榜的台词一样:问题出自朝堂,答案却在江湖。这里是问题出自Lucene源码,答案却在数学。

    第三步:计算文档向量长度|V(d)|

    这里其实是不能沿用第二步的做法的。前面已经提到,向量有两大要素:方向和长度。余弦公式只考虑了方向因素。这样在实际应用中,余弦相似度就是向量长度无关的了。

    这在搜索引擎中,如果查询语句命中了长文档和短文档,按照余弦公式TF-IDF特征,偏向于对短小的文档打较高的分数。对长文档不公平,所以需要优化一下。

    这里的优化思路就是采用文档词个数累积,从而降低长文档和短文档之间的差距。当然这里的业务诉求可能比较多样,所以在源码实现的时候,开放了接口允许用户自定义。借以提升灵活度。

    第四步:混合用户权重和打分因子

    所谓用户权重,就是指用户指定查询词的权重。例如典型地竞价排名就是人为提升某些查询词的权重。所谓打分因子,即如果一个文档中相比其它的文档出现了更多的查询关键词,那么其值越大。综合考虑了多词查询的场景。经过4步,我们再看推导出来的公式和实际公式,发现相似度非常高。

    推导公式和官方公式基本就一致了。

    五、总结

    本文简单介绍了余弦相似度的数学背景。从埃及金字塔的建设问题出发,引出了勾股定理,进而引出了余弦定理。并基于向量推导出来了余弦公式。

    接下来通过三个业务场景的例子,介绍余弦公式的应用,即数学模型如何落地到业务场景中。这三个简单的例子代码不过百行,能够帮助读者更好地理解余弦相似度。

    最后介绍了一个工业级的样例。基于Lucene构建的ES是当前最火热的搜索引擎解决方案。学习余弦公式在Lucene中落地,有助于理解业界的真实玩法。进一步提升对余弦公式的理解。

    六、参考文献

    1. 书籍《数学之美》 作者:吴军

    2. 图像基础7 图像分类——余弦相似度


    作者:Shuai Guangying

    展开全文
  • 各种三角形边长的计算公式

    万次阅读 2018-12-10 12:22:25
    勾股定理,只适用于直角三角形(外国叫“毕达哥拉斯定理”) a^2+b^2=c^2, 其中a和b分别为直角三角形两直角边,c为斜边。 勾股弦数是指一组能使勾股定理关系成立的三个正整数。比如:3,4,5。他们分别是3,4和5的...
  • 各种三角形边长的计算公式解三角形解直角三角形(斜三角形特殊情况):勾股定理,只适用于直角三角形(外国叫“毕达哥拉斯定理”)a^2+b^2=c^2,其中a和b分别为直角三角形两直角边,c为斜边。勾股弦数是指一组能使勾股...
  • 定义 随着底面形状不同,棱锥的称呼也不相同,依底面多边形而定,底面是正方形的棱锥称为方锥。...如果题目没有给高度,可根据正方形边长和棱长,利用勾股定理求得。红线和蓝线所画是两种求法。 ...
  • android 五角星画法 五角星计算公式

    千次阅读 2017-07-19 18:15:35
    计算依据,每个五角星的角度为36°,然后根据简单的勾股定理即可算出各个点的坐标,如下图所示 /** * @param xA 起始点位置A的x轴绝对位置 * @param yA 起始点位置A的y轴绝对位置 * @param rFive 五角星边的...
  • > 之前在计算三角形面积时...假设一个普通三角形三边长分别为a、b、c,c边的高为h: 根据勾股定理,我们可以得出 两边平方后整理可得: 两边继续平方并整理可得 根据三角形面积公式: 代入之前h的值 整理得: ...
  • > 之前在计算三角形面积时...假设一个普通三角形三边长分别为a、b、c,c边的高为h: 根据勾股定理,我们可以得出 两边平方后整理可得: 两边继续平方并整理可得 根据三角形面积公式: 代入之前h的值 整理得: ...
  • 之前在计算三角形面积时使用了海伦公式 S=p×(p−a)×(p−b)×(p−c)S=\sqrt{p\times(p-a)\times(p-b)\times(p-c)}S=p×(p−a)×(p−b)×(p−c)​(p为周长的一半) ...根据勾股定理,我们可以得出 c=(b2−h2)+(a...
  • 有关数学公式的证明很多,下面介绍几个常见公式的巧妙证明过程。(1)自然数的立方和=自然数之和的平方上述等式的左边为自然数的立方和,等式的右边为自然数之和的平方。...(2)勾股定理这个公式勾股定理,我国在...
  • 海伦公式计算器.rar

    2019-07-03 10:51:41
    用C#编写的一个计算器,该计算器可以根据三角形的三个边采用海伦公式计算出每个边的高;...第三个功能是勾股定理计算,当你输入一条斜边边长和一条直角边变长两个参数,可以输出第二条直角边的边长。
  • 有关数学公式的证明很多,下面介绍几个常见公式的巧妙证明过程。(1)自然数的立方和=自然数之和的平方上述等式的左边为自然数的立方和,等式的右边为自然数之和的...(2)勾股定理这个公式勾股定理,我国在商朝时就已...
  • 三角函数:正弦余弦定理及应用

    千次阅读 2018-02-28 15:55:13
    1.余弦定理公式余弦定义主要作用是依靠已知三角形的两条边及其夹角,求第三边的情况,如下图:这里我们不处理向量(矢量)运算,单纯的从标量数值长度的推算入手,建立垂线后,得到的直角三角形ADC,可以通过勾股...
  • 计算两点之间的距离

    2012-01-21 12:31:46
    计算两点之间的距离根据勾股定理,使用Math.pow( ) 和Math.sqrt( ) 联合计算讨论通过勾股定理可以计算出两点之间的距离(直线)。一个三角形,最长边的平方等于其他两边的平方和:a2 + b2 = c2根据这个公式可以计算...
  • 勾股定理:a*a+b*b=c*c,其中a/b分别为直角三角形的一、理论篇1. 数学公式圆面积公式:π*r*r,其中π为圆周率,r为圆半径;正方形面积公式:s*s,其中s为边长;勾股定理:a*a + b*b = c*c,其中a/b分别为直角三角形...
  • 欧式距离,其实就是应用勾股定理计算两个点的直线距离 二维空间的公式 其中, 为点与点之间的欧氏距离;为点到原点的欧氏距离。 三维空间的公式 n维空间的公式 曼哈顿距离,就是表示两个点在...
  • A.最短路(计算几何)

    2020-04-23 09:02:52
    A.最短路(计算几何) 题目传送门 题意:给定A,B,坐标和,以C为圆心的坐标和半径r,求A到B的最短...第二种情况:利用勾股定理和圆弧公式即可。 AC代码: #include<bits/stdc++.h> using namespace std; struc...
  • 10 简化几何计算

    2016-12-10 11:26:00
    这个公式称为勾股定理。现在给出直角三角形的两条边,要求计算出第三条边。 2.输入描述 输入包含多个三角形的描述。每个描述在一行上,包括三个整数a、b 和c,表示三角形的三条边长。三个数中有一个是-1...
  • 计算两点间的距离

    2021-01-03 12:12:20
    本题计算两个坐标之间的距离,运用了数学公式勾股定理,a2 =b2 +c2其中b与c为直角边,a为斜边,及两点之间的距离。 一、题目描述 Problem Description 输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离。 ...
  • 各位家长好,我是家长无忧(jiazhang51.cn)专栏作者,七玥老师全文共计549字,建议阅读2分钟如果是三角形是直角三角形,了解两侧,可以用勾股定理求出第三边。如果是三角形是一般三角形(钝角、钝角三角形),那这一...
  • 勾股定理:a*a + b*b = c*c,其中a/b分别为直角三角形的两个直角边,c为斜边。2. 计算方法考虑下图,边长为r的正方形内嵌了一个以r为半径的1/4圆。 InsideCircle面积 = 以r为半径的圆面积 / 4 = π*r*r/4正方形面积 ...
  • 以16:9 的显示器来计算.... 一寸=2.54CM. ...由于长与宽的比例是 16:9 , 而所说的 XX英寸显示器是以斜对角线来说的. ...为了方便转换, 以二十英寸来计算. ...故有以下两个公式:  ...2. A^2+B^2= 50.80^2 (勾股定理) ...
  • 有关数学公式的证明很多,下面介绍几个常见公式的巧妙证明过程。(1)自然数的立方和=自然数之和的平方上述等式的左边为自然数的立方和,等式的右边为自然数之和的...(2)勾股定理这个公式勾股定理,我国在商朝时就已...
  • 1. 欧式距离与余弦距离的点积表示欧式距离 与 的欧氏距离就是下图中的虚线: 欧式距离可以通过勾股定理,或者点积来计算: 余弦距离 与 的余弦距离就是下图中 角的余弦:根据线性代数的知识,余弦也可以通过点积和模...
  • 计算XY坐标距离,并且比较目标最近的距离,求距离的话,我采用的是勾股定理,A的平方+B的平方=C的平方 然后C进行比较,C-其他距离,然后绝对值比较 ,最小的值,就是最近的距离。 例如: 目标距离是3 然后分别...
  • 知道对角线长度后就可以根据勾股定理计算出显示器的长宽与面积。(勾股定理公式:a2+b2=c2) 假如显示器的长宽是16:9,设显示器的长尾16x;则宽为9x;代入公式可得(16x)平方+ (9x)平方= c平方 再把对角线...
  • 6.3 广义勾股定理 6.4 正方形和正六边形上的差分格式 6.4.1 长算子 6.4.2 紧凑算子 6.4.3 在波场外推中的应用 第7章 三维频率空间域显式波场外推 7.1 稳定的显式外推格式 7.2 McClellan滤波器 7.3 旋转的McClellan...

空空如也

空空如也

1 2 3
收藏数 54
精华内容 21
关键字:

勾股定理计算公式