Machine Learning 之 LOF离群点检验

#coding=utf-8
#本质是基于密度的检测 缺点:计算量巨大
#优化 重复点计算
import math
print sorted([1,3,2])[:1],[1,3,2][1:]

class LOF:
    def __init__(self,data,k,threshold):
        self.data=data
        self.k=k
        self.threshold=threshold
        self.outliners=[]

    def __calDistance(self,a,b):
        sum1=0
        for k in range(len(a)):
            sum1+=((a[k]-b[k])**2)
        sum1=math.sqrt(sum1)
        if sum1==0:
            sum1=0.00000001
        return sum1

    def __calNk(self,point):
        Nk=[]
        disList=[]
        for j in range(len(self.data)):
            dis=self.__calDistance(point,self.data[j])
            disList.append([dis,data[j]])
        distList=sorted(distList)
        distance=distList[k-1][0]
        distList=distList[0:k-1]
        disList2=[]
        for di in distList[k-1:]:
            if di[0]==distList[k-1][0]:
                disList2.append(di)
        Nk=distList+disList2
        Nk=[nk[1] for nk in Nk]
        return Nk,distance

    def __getReachDis(self,point,Nk):
        reachDis=[]
        for nk in Nk:
            Nk1,dis1=self.__calNk(point)
            dis2=self.__calNk(point,nk)
            reachDis.append(max(distance,distance2))
        return reachDis

    def __getLrd(self,point):
        Nk,distance=self.__calNk(point)
        reachDis=self.__getReachDis(point,Nk)
        lrdPoint=1.0*sum(reachDis)/len(reachDis)
        return lrdPoint,Nk

    def __getLrdList(self,num):
        lrdList=[]
        lrdPoint,Nk=self.__getLrd(self.data[num])
        for l in range(len(Nk)):
            lr,=self.__getLrd(Nk(l))
            lrdList.append(lr)
        return lrdPoint,lrdList

    def __getLOF(self,num):
        lrdPoint,lrdList=self.__getLrdList(num)
        lofValue=0
        for lrd in lrdList:
            lofValue+=1.0*(lrd/lrdPoint)
        lofValue=lofValue/len(lrdList)
        return self.data[i],lofValue

    def run(self):
        for i in range(len(data)):
            lofP,lofV=self.__getLOF(i)
            if lofV>self.threshold:
                self.outliners.append(lofP)
        self.outliners=list[(self.outliners)]
        return self.outliners
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是LOF离群检测计算的一个例子: 假设我们有一个数据集,其中包含5个样本,每个样本有两个特征。我们想要使用LOF算法来检测这些样本中的离群。 首先,我们需要计算每个样本的k距离和k邻域。假设我们选择k=2,则每个样本的k距离和k邻域如下所示: | 样本 | k距离 | k邻域 | |--------|-------|-------| | A | 0.4 | B,C | | B | 0.4 | A,C | | C | 0.4 | A,B | | D | 0.6 | E,B | | E | 0.6 | D,B | 接下来,我们需要计算每个样本的局部可达密度(lrd)。对于每个样本i,lrd(i)的计算方法如下: lrd(i) = 1 / (sum(reachdist(j,i)) / k) 其中,reachdist(j,i)表示样本j到样本i的可达距离,计算方法如下: reachdist(j,i) = max(k距离(i),距离(i,j)) 因此,我们需要计算每个样本到其k邻域中所有其他样本的可达距离,然后将它们相加并除以k,即可得到lrd(i)的值。假设我们选择样本A进行计算,则lrd(A)的计算方法如下: reachdist(B,A) = max(0.4,distance(A,B)) = 0.4 reachdist(C,A) = max(0.4,distance(A,C)) = 0.4 lrd(A) = 1 / ((0.4 + 0.4) / 2) = 2 同样地,我们可以计算出每个样本的lrd值: | 样本 | lrd | |--------|-----| | A | 2 | | B | 2 | | C | 2 | | D | 1.5 | | E | 1.5 | 最后,我们可以计算每个样本的局部离群因子(lof)。对于每个样本i,lof(i)的计算方法如下: lof(i) = (sum(lrd(j) / lrd(i) for j in k邻域(i))) / k 因此,我们需要计算每个样本的k邻域中所有其他样本的lrd值,并将它们相加并除以k,然后再除以样本i的lrd值,即可得到lof(i)的值。假设我们选择样本A进行计算,则lof(A)的计算方法如下: lof(A) = ((lrd(B) / lrd(A)) + (lrd(C) / lrd(A))) / 2 = (2/2 + 2/2) / 2 = 1 同样地,我们可以计算出每个样本lof值: | 样本 | lof | |--------|-----| | A | 1 | | B | 1 | | C | 1 | D | 1.33| | E | 1.33|

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值