query儲存的索引 batch與否是否影響?

2021-10-02 03:33:49 字數 2625 閱讀 5338

這個思維與這篇博文類似,都是菜鳥思維。

在knn儲存index之前是否一定要進行一次嘗試搜尋,此搜尋的作用是什麼?這個搜尋是單個資料與batch資料有區別嗎??

下面以mnist資料作為例子來看:

1-是否需要一次搜尋??嘗試不搜尋儲存下index試試,對比前後結果是否一致。

先進行了pca儲存為20d,沒有嘗試搜尋,直接儲存index。

載入index並進行單個資料的query,已知資料標籤0,topk=100,後來得到100個也是0,這是我要的結果——

【前幾天與同事吃飯時討論,同事觀點是topk數要小於類別數,否則可能會召回其他標籤資料,我覺得並無關係,只要我資料庫中有此搜尋標籤的個數大於topk即可,那麼召回的應該全是此標籤的資料,此時查準率precision為100%;進一步來說,如果我資料庫中有此標籤資料恰好也是100,並且也是topk=100,那麼召回的全是正確的,正確的都被召回了,此時剛好是查準率和查全率[召回率]都為100%,這種情況沒有,屬於特例中的特例】

**結果如下:

array([  1,  35,  82,  59,  86,  29, 164,  26,  81,   2,  28,  84, 132,

16, 67, 34, 153, 33, 85, 135, 133, 169, 73, 68, 157, 5,

4, 51, 76, 163, 74, 65, 177, 75, 70, 155, 162, 118, 25,

80, 87, 32, 154, 128, 17, 138, 77, 90, 101, 55, 171, 142,

168, 0, 102, 115, 174, 7, 36, 13, 41, 114, 110, 89, 48,

47, 150, 12, 64, 139, 53, 145, 79, 131, 24, 19, 69, 137,

38, 160, 42, 40, 22, 52, 14, 6, 71, 122, 170, 134, 3,

30, 166, 20, 62, 92, 124, 113, 116, 176])

array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

如果我嘗試了一次query並儲存,看看結果是否相同。並多次更換搜尋的資料做對比

出大事了,結論:不必進行嘗試搜尋即可直接儲存index

因為每次knn初始化後的index結果可能不同【??不肯定,但下面結果支援這種猜測】,導致每次初始化後進行同樣的資料搜尋結果不同,而初始化後同樣的資料多次搜尋結果是一樣的。

下面是不同次knn初始化後的結果:微小不同,細微之處見不同

{0, 1, 2, 3, 4, 5, 6, 7, 12, 13, 14, 16, 17, 20, 22, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 38, 40,。。。。

{0, 1, 2, 3, 4, 5, 6, 7, 12, 13, 14, 16, 17, 18, 20, 21, 22, 24, 25, 26, 28, 29, 30, 32, 33, 34, 35, 36, 38, 40, 。。。

{0, 1, 2, 3, 4, 5, 6, 7, 12, 13, 14, 16, 17, 18, 19, 20, 22, 24, 25, 26, 28, 29, 30, 32, 33, 34, 35, 36, 38, 40,。。。

但所幸最後的標籤是一樣的。不影響。

2-batch搜尋與否結果是什麼??

沒有差別,但輸入input要求是列表,返回的是元組,第乙個是index,第二個是距離

舉例如下:

input=[x2[1]],k=5

[(array([ 1, 35, 82, 59, 86]), array([0. , 0.09829187, 0.11836755, 0.13198316, 0.13549852],

dtype=float32))]

input=[x2[1],x2[2]],k=5

[(array([ 1, 35, 82, 59, 86]), array([0. , 0.09829187, 0.11836755, 0.13198316, 0.13549852],

dtype=float32)), (array([ 2, 86, 7, 12, 25]), array([1.1920929e-07, 7.3889017e-02, 7.6626837e-02, 9.1660738e-02,

9.4139397e-02], dtype=float32))]

qq群:868373192 

mysql索引儲存形式 MySql索引儲存形式

聚簇索引 聚集索引 非聚簇索引 非聚集索引 是因為儲存引擎不同引起的,儲存引擎中innodb是聚簇索引 myisam是非聚簇索引,聚簇索引是資料與索引儲存在乙個起,非聚簇索引資料乙個檔案 索引乙個檔案,資料與索引不在乙個檔案中。mysql的索引以b tree的資料結構儲存在磁碟,預設儲存引擎為inn...

InfluxDB的索引儲存

tsi 預設配置下索引資訊存放於記憶體中,index version tsi1 配置作用是將索引資訊持久化至硬碟,tsi索引主要包含logfile檔案 tsl結尾 tsi檔案,其實上篇提到的series 檔案也算。tsl tsi檔案位於在每個shard中index目錄下。index file 當ts...

索引的儲存結構

下面是本人畫的一張關於資料頁和索引儲存結構圖 此圖中,最上部分是資料頁的儲存結構。下半部分是表中有索引,這裡就出現了b tree結構,索引的根級會引用索引的下一級,直到索引的最後一級,這一級引用的物件是rid 當表中不存在聚集索引時,rid會指向每一行資料儲存位置,rid的字段長度為16位元組 或聚...