演算法 入門篇(余弦相似度)

2021-10-04 16:54:02 字數 4286 閱讀 3256

數學模型

計算公式

一般來講最終資料越接近於1,表示分子與分母部分的夾角越小

用途:

使用余弦相似度的場景一般用在判斷兩條資料的相似程度上,常見使用在,風控系統中對密碼驗證的場景等。當相似度即最終值越接近於1時,表示密碼的相似度越高。

本文將根據密碼相似度驗證簡單介紹此演算法的使用。

但是,現實往往是存在著差異性的,比如使用者的歷史密碼的長度都不一致等,因此,在此場景下,我們需要引入詞袋。

詞袋:詞袋模型(英語:bag-of-words model)是個在自然語言處理和資訊檢索(ir)下被簡化的表達模型。

/**① 主幹--作評估

ordernesspassword ---- 請求密碼

historyordernesspasswords ----- 歷史密碼集合

*/public

boolean

doeval

(string ordernesspassword, set

historyordernesspasswords)

//獲取包含所有歷史密碼的詞袋

setwordbag =

newhashset

();//獲取歷史密碼流

list<

char

> collect = historyordernesspasswords.

stream()

.map

(histroyt -

> histroyt.

tochararray()

).collect

(collectors.

tolist()

);for(

char

chars : collect)

}//將當前輸入的密碼加入詞袋

char

chars = ordernesspassword.

tochararray()

;for

(int i =

0; i < chars.length; i++

)//對詞袋進行排序,排序後的最終詞袋

list

bag = wordbag.

stream()

.sorted()

.collect

(collectors.

tolist()

);//建立乙個歷史密碼的特徵向量集合

list

]> histroryvictorlist =

newarraylist

<

>()

;//計算歷史密碼的特徵

list

history = historyordernesspasswords.

stream()

.collect

(collectors.

tolist()

);for(

int i =

0; i < history.

size()

; i++

)//計算當前輸入密碼的特徵向量

integer[

] tempvictor =

getpasswordvector

(bag, ordernesspassword)

;//拿當前的密碼特徵向量與歷史的特徵向量進行余弦相似比較

/*for (int i = 0; i < histroryvictorlist.size(); i++)

}*/list

result = histroryvictorlist.

stream()

.map

(x -

>).

filter

(similarity -

> similarity > thresholdsimilarity)

.collect

(collectors.

tolist()

);return result.

size()

==0;}

//建立乙個計算特徵向量的方法

private integer[

]getpasswordvector

(list

bag,string ordernesspassword)

else

}//建立一返回值,長度即為詞袋長度

integer[

] restult =

newinteger

[bag.

size()

];//對詞袋數值進行公升序排列

//對比詞袋,進行特性抽取

for(

int i =

0; i < bag.

size()

; i++

)else

}//最後返回integer陣列

return restult;

}//建立乙個求余弦相似的方法

private double getsimilarity

(integer[

] passwordvictor,integer[

] historyvictor)

//計算分母

integer integer1 = arrays.

stream

(passwordvictor)

.map

(i -

>

(i * i)).

reduce

((x, y)

-> x + y)

.get()

; integer integer2 = arrays.

stream

(historyvictor)

.map

(i -

>

(i * i)).

reduce

((x, y)

-> x + y)

.get()

;//按照公式得出最終的分母部分

double denominator = math.

sqrt

(integer1)

*math.

sqrt

(integer2)

;//得出最終結果

return element/denominator;

}

public

static

void

main

(string[

] args)

}

這是乙個獲取亂序密碼的方法
string pwd=

"123456abc"

;//獲得字元陣列

char

chars = pwd.

tochararray()

;//建立乙個字元集合

list

characters=

newarraylist

<

>()

;//遍歷字元陣列,向集合中新增

for(

char achar : chars)

//隨機排序輸出

string ordernesspassword = characters.

stream()

.sorted

((o1, o2)

->

newinteger

[new

random()

.nextint(3

)]).

map(c -

> c +"")

.reduce

((v1, v2)

-> v1 + v2)

.get()

;

相似度演算法之余弦相似度

余弦距離,也稱為余弦相似度,是用向量空間中兩個向量夾角的余弦值作為衡量兩個個體間差異的大小的度量。余弦值越接近1,就表明夾角越接近0度,也就是兩個向量越相似,這就叫 余弦相似性 上圖兩個向量a,b的夾角很小可以說a向量和b向量有很高的的相似性,極端情況下,a和b向量完全重合。如下圖 如上圖二 可以認...

余弦相似度

余弦距離 歐氏距離和傑卡德相似性度量的對比分析 1 余弦距離 余弦距離,也稱為余弦相似度,是用向量空間中兩個向量夾角的余弦值作為衡量兩個個體間差異的大小的度量。向量,是多維空間中有方向的線段,如果兩個向量的方向一致,即夾角接近零,那麼這兩個向量就相近。而要確定兩個向量方向是否一致,這就要用到餘弦定理...

余弦相似度

基於餘弦定理計算相似度的應用很多,比如推薦系統中的協同過濾,計算文字的相似性等等。它用計算兩者空間向量的夾角來表示兩者的相似性。先看一下餘弦定理的公式 wu v u ivi u2i v 2i 上訴公式表示uv兩者的相似度,ui表示u在i緯度的數值。在使用者行為資料 使用者只有操作和未操作兩種狀態,也...