HTM 使用HTM進行異常檢測

2021-10-03 11:05:54 字數 3782 閱讀 2417

如果你對htm感興趣,我建立了乙個群,我們共同學習交流。515743445。

本文研究使用htm進行單變數的異常檢測,並嘗試復現了numenta的計程車異常檢測結果。numenta的異常檢測專案在這裡我們復現下的numentatm_nyc_taxi.csv的結果。

建議先閱讀readme對nab有個基本了解。

首先,在numentatm_nyc_taxi.csv中我們看到,該計程車檢測結果的異常分數一列,構成的圖形,清晰的顯示出了四個異常點,這與numenta的**中的圖形是一致的。

我們不使用nab提供的框架重複結果,採用直接呼叫algorithm的方式來復現。

**如下

from nupic.algorithms.spatial_pooler import spatialpooler as sp

from nupic.algorithms.backtracking_tm_shim import tmcppshim as tm

from nupic.encoders.random_distributed_scalar import randomdistributedscalarencoder

from nupic.encoders.date import dateencoder

from nupic.algorithms import anomaly

from datetime import datetime

import numpy as np

from tqdm import tqdm

from matplotlib import pyplot as plt

data_url = ""

path = "c:/users/mi/pycharmprojects/nupic-master/nab/"

data = "nyc_taxi.csv"

value = np.loadtxt(path+data,usecols=(1),delimiter=',',skiprows=1,dtype=np.int32)

time = np.loadtxt(path+data,usecols=(0),delimiter=',',skiprows=1,dtype=np.str)

sp = sp(inputdimensions=(454, 1),

columndimensions=(2048, 1),

potentialradius=2048,

potentialpct=0.8,

globalinhibition=true,

localareadensity=-1,

numactivecolumnsperinharea=40,

synperminactivedec=0.0005,

synpermactiveinc=0.003,

synpermconnected=0.2,

dutycycleperiod=1000,

booststrength=0.0,

seed=1956)

tm = tm( numberofcols=2048,

cellspercolumn=32,

initialperm=0.24,

connectedperm=0.50,

minthreshold=13,

permanenceinc=0.04,

permanencedec=0.008,

predictedsegmentdecrement=0.001,

newsynapsecount=31,

globaldecay=0.0,

activationthreshold=20,

seed=1960,

verbosity=0,

pamlength=3,

maxage=0,

maxsegmentspercell=128,

maxsynapsespersegment=128,

outputtype='normal',

)dateencoder = dateencoder(timeofday=(21, 9.49))

randomencoder = randomdistributedscalarencoder(resolution=422.03538461538466,seed=42)

def encode(date,value):

t = datetime.strptime(date[2:-3], "%y-%m-%d %h:%m")

datesdr = dateencoder.encode(t)

valuesdr = randomencoder.encode(value)

sdr = np.concatenate((datesdr,valuesdr))

return sdr

prdictivecolumns = np.zeros(2048)

x = np.arange(0,10320)

y =

for t, v in zip(time, value):#[:200]:

sdr = encode(t, v)

column = np.zeros(2048,dtype=np.int32)

sp.compute(sdr, true, column)

#print 'activatecolumns:',activatecolumns

prdictivecolumnssdr = tm.topdowncompute().copy()

prdictivecolumns = prdictivecolumnssdr.nonzero()[0]

#print 'prdictivacolumns:', prdictivecolumns

tm.compute(column, true,true)

activatecolumns = np.nonzero(column)[0]

activatecolumns = activatecolumns.astype(np.int32)

score = anomaly.computerawanomalyscore(activatecolumns, prdictivecolumns)

#print score

y = np.array(y)

plt.plot(x,y)

plt.show()

這裡有幾個注意點:

第一:我們使用nupic.algorithms.backtracking_tm_shim,該tm與標準tm實現不同,專門為異常檢測做了優化,但是該方法官方已不再維護。

第二:encoder,sp和tm使用的引數,來自getscalarmetricwithtimeofdayanomalyparams方法,實際讀取自nupic專案下的/src/nupic/frameworks/opf/common_models/anomaly_params_random_encoder/best_single_metric_anomaly_params_tm_cpp.json

第三:這些引數是numenta反覆試驗獲得的最優結果。

然後我們獲得了相同的結果:

很抱歉之前兩篇解讀sp和tm的文章寫的很雜亂,但是我不想改了。。。讀**嘛,一行行讀就是了,寫的還是很清晰的。裡面幾個核心類使用c++加速,但是並不影響閱讀。基本上到這裡再想深入學習htm,就要看numenta的最新**了,沒有成熟和結構良好的**和文件了。他們最新的幾篇**關於位置理論,其最新思想似乎是將位置訊號作為tm的偏置輸入,這樣相比於本文中將兩個編碼器的結構直接相連的效果要好。

android textview 使用html樣式

在textview中使用html樣式顯示,有些注意點,style沒有作用,比如在html這種樣式是可以的,但在textview的時候顯示不可以的。在string裡面的 這個符號一般要用 轉義字元 這樣用。html.fromhtml string 這個方法返回的是 spanned 要用html樣式的時...

使用BeautifulSoup解析HTML

通過css屬性來獲取對應的標籤,如下面兩個標籤 可以通過class屬性抓取網頁上所有的紅色文字,具體 如下 from urllib.request import urlopen from bs4 import beautifulsoup html urlopen bsobj beautifulsou...

使用BeautifulSoup解析html頁面

1 有很多開源庫以及python自動的htmlparser庫都可以解析html,簡單的功能,用哪個都一樣,看個人習慣,此處簡單介紹一下beautifulsoup的用法,詳細的用法可以參考官方文件 url 3 示例 from beautifulsoup import beautifulsoup imp...