<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Anomaly Detection - Local Outlier Factor in Quick Measures Gallery</title>
    <link>https://community.fabric.microsoft.com/t5/Quick-Measures-Gallery/Anomaly-Detection-Local-Outlier-Factor/m-p/3238406#M976</link>
    <description>&lt;P&gt;Demonstrates how to implement the Local Outlier Factor (LOF) anomaly detection algorithm in DAX.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;LOF Measure = 
    VAR __ID = MAX('Table'[ID])
    VAR __Table0 = ALL('Table')
    VAR __Table = 
        FILTER( 
            GENERATE( 
                SELECTCOLUMNS( __Table0,"ID1",[ID] ) , 
                SELECTCOLUMNS( __Table0,"ID2",[ID] ) 
            ), 
            [ID1] &amp;lt;&amp;gt; [ID2]
        )
    VAR __Table1 = 
        ADDCOLUMNS(
            __Table,
            "ID3", IF([ID1] &amp;lt; [ID2], [ID1], [ID2]),
            "ID4", IF([ID1] &amp;gt; [ID2], [ID1], [ID2])
        )
    VAR __Table3 = 
        ADDCOLUMNS(
            DISTINCT( SELECTCOLUMNS( __Table1, "ID1", [ID3], "ID2", [ID4] ) ),
            "MD",
                VAR __ID1 = [ID1]
                VAR __ID2 = [ID2]
                VAR __x1 = MAXX(FILTER(__Table0, [ID] = __ID1), [X])
                VAR __y1 = MAXX(FILTER(__Table0, [ID] = __ID1), [Y])
                VAR __x2 = MAXX(FILTER(__Table0, [ID] = __ID2), [X])
                VAR __y2 = MAXX(FILTER(__Table0, [ID] = __ID2), [Y])
                VAR __Result = ABS(__x1 - __x2) + ABS(__y1 - __y2)
            RETURN
                __Result
        )
    VAR __Table4 = 
        ADDCOLUMNS(
            ADDCOLUMNS(
                SELECTCOLUMNS(
                    __Table0,
                    "ID",[ID],"X",[X],"Y",[Y]
                ),
                "k-MD",
                    VAR __ID = [ID]
                    VAR __Table = FILTER(__Table3, [ID1] = __ID || [ID2] = __ID)
                    VAR __kMD = MAXX(TOPN([k], __Table, [MD],ASC),[MD])
                RETURN
                    __kMD         
            ),
            "K-neighborhood",
                VAR __kMD = [k-MD]
                VAR __ID = [ID]
                VAR __Table = FILTER('Table 2', [ID1] = __ID || [ID2] = __ID)
                VAR __Result = COUNTROWS( FILTER( __Table, [MD] &amp;lt;= __kMD ) )
            RETURN
                __Result
        )
    VAR __Table5 = 
        ADDCOLUMNS(
            __Table4,
            "LRD",
                VAR __kMD = [k-MD]
                VAR __Kneighborhood = [K-neighborhood]
                VAR __ID = [ID]
                VAR __Table = FILTER('Table 2', ( [ID1] = __ID || [ID2] = __ID ) &amp;amp;&amp;amp; [MD] &amp;lt;= __kMD )
                VAR __Table1 = 
                    ADDCOLUMNS( 
                        __Table, 
                        "MaxMD", 
                                VAR __LookupValue = IF([ID1] = __ID, [ID2], [ID1])
                                VAR __LookupKMD = MAXX(FILTER(__Table4, [ID] = __LookupValue), [k-MD])
                            RETURN
                            MAX( [MD], __LookupKMD) )
                VAR __Result = DIVIDE( 1, DIVIDE( SUMX( __Table1, [MaxMD] ), __Kneighborhood ))
            RETURN
                __Result
        )
    VAR __Table6 = 
        ADDCOLUMNS(
             __Table5,
             "LOF",
                VAR __kMD = [k-MD]
                VAR __Kneighborhood = [K-neighborhood]
                VAR __LRD = [LRD]
                VAR __ID = [ID]
                VAR __Table = FILTER(__Table3, ( [ID1] = __ID || [ID2] = __ID ) &amp;amp;&amp;amp; [MD] &amp;lt;= __kMD )
                VAR __IDs = DISTINCT( FILTER( UNION( SELECTCOLUMNS( __Table, "ID", [ID1] ), SELECTCOLUMNS( __Table, "ID", [ID2] ) ), [ID] &amp;lt;&amp;gt; __ID ) )
                VAR __Table1 = FILTER( __Table5, [ID] IN __IDs )
                VAR __Result = DIVIDE( SUMX( __Table1, [LRD] ), __Kneighborhood ) * DIVIDE(1, __LRD)
            RETURN
                __Result
        )
    VAR __Result = MAXX(FILTER(__Table6, [ID] = __ID), [LOF])
RETURN
    __Result&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;div data-video-id="https://youtu.be/q6p0JtZaplM" data-video-remote-vid="https://youtu.be/q6p0JtZaplM" class="lia-video-container lia-media-is-center lia-media-size-medium"&gt;&lt;iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2Fq6p0JtZaplM%3Ffeature%3Doembed&amp;amp;display_name=YouTube&amp;amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Dq6p0JtZaplM&amp;amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2Fq6p0JtZaplM%2Fhqdefault.jpg&amp;amp;type=text%2Fhtml&amp;amp;schema=youtube" allowfullscreen="" style="max-width: 100%"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="reportid hidden"&gt;eyJrIjoiYjRiMjUyODMtZmFjNy00MjVmLTk5OGEtOWNiMDc0NGNmMGQ0IiwidCI6IjRhMDQyNzQzLTM3M2EtNDNkMi04MjdiLTAwM2Y0YzdiYTFlNSIsImMiOjN9&lt;/SPAN&gt;&lt;/P&gt;</description>
    <pubDate>Tue, 16 May 2023 16:36:06 GMT</pubDate>
    <dc:creator>Greg_Deckler</dc:creator>
    <dc:date>2023-05-16T16:36:06Z</dc:date>
    <item>
      <title>Anomaly Detection - Local Outlier Factor</title>
      <link>https://community.fabric.microsoft.com/t5/Quick-Measures-Gallery/Anomaly-Detection-Local-Outlier-Factor/m-p/3238406#M976</link>
      <description>&lt;P&gt;Demonstrates how to implement the Local Outlier Factor (LOF) anomaly detection algorithm in DAX.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;LOF Measure = 
    VAR __ID = MAX('Table'[ID])
    VAR __Table0 = ALL('Table')
    VAR __Table = 
        FILTER( 
            GENERATE( 
                SELECTCOLUMNS( __Table0,"ID1",[ID] ) , 
                SELECTCOLUMNS( __Table0,"ID2",[ID] ) 
            ), 
            [ID1] &amp;lt;&amp;gt; [ID2]
        )
    VAR __Table1 = 
        ADDCOLUMNS(
            __Table,
            "ID3", IF([ID1] &amp;lt; [ID2], [ID1], [ID2]),
            "ID4", IF([ID1] &amp;gt; [ID2], [ID1], [ID2])
        )
    VAR __Table3 = 
        ADDCOLUMNS(
            DISTINCT( SELECTCOLUMNS( __Table1, "ID1", [ID3], "ID2", [ID4] ) ),
            "MD",
                VAR __ID1 = [ID1]
                VAR __ID2 = [ID2]
                VAR __x1 = MAXX(FILTER(__Table0, [ID] = __ID1), [X])
                VAR __y1 = MAXX(FILTER(__Table0, [ID] = __ID1), [Y])
                VAR __x2 = MAXX(FILTER(__Table0, [ID] = __ID2), [X])
                VAR __y2 = MAXX(FILTER(__Table0, [ID] = __ID2), [Y])
                VAR __Result = ABS(__x1 - __x2) + ABS(__y1 - __y2)
            RETURN
                __Result
        )
    VAR __Table4 = 
        ADDCOLUMNS(
            ADDCOLUMNS(
                SELECTCOLUMNS(
                    __Table0,
                    "ID",[ID],"X",[X],"Y",[Y]
                ),
                "k-MD",
                    VAR __ID = [ID]
                    VAR __Table = FILTER(__Table3, [ID1] = __ID || [ID2] = __ID)
                    VAR __kMD = MAXX(TOPN([k], __Table, [MD],ASC),[MD])
                RETURN
                    __kMD         
            ),
            "K-neighborhood",
                VAR __kMD = [k-MD]
                VAR __ID = [ID]
                VAR __Table = FILTER('Table 2', [ID1] = __ID || [ID2] = __ID)
                VAR __Result = COUNTROWS( FILTER( __Table, [MD] &amp;lt;= __kMD ) )
            RETURN
                __Result
        )
    VAR __Table5 = 
        ADDCOLUMNS(
            __Table4,
            "LRD",
                VAR __kMD = [k-MD]
                VAR __Kneighborhood = [K-neighborhood]
                VAR __ID = [ID]
                VAR __Table = FILTER('Table 2', ( [ID1] = __ID || [ID2] = __ID ) &amp;amp;&amp;amp; [MD] &amp;lt;= __kMD )
                VAR __Table1 = 
                    ADDCOLUMNS( 
                        __Table, 
                        "MaxMD", 
                                VAR __LookupValue = IF([ID1] = __ID, [ID2], [ID1])
                                VAR __LookupKMD = MAXX(FILTER(__Table4, [ID] = __LookupValue), [k-MD])
                            RETURN
                            MAX( [MD], __LookupKMD) )
                VAR __Result = DIVIDE( 1, DIVIDE( SUMX( __Table1, [MaxMD] ), __Kneighborhood ))
            RETURN
                __Result
        )
    VAR __Table6 = 
        ADDCOLUMNS(
             __Table5,
             "LOF",
                VAR __kMD = [k-MD]
                VAR __Kneighborhood = [K-neighborhood]
                VAR __LRD = [LRD]
                VAR __ID = [ID]
                VAR __Table = FILTER(__Table3, ( [ID1] = __ID || [ID2] = __ID ) &amp;amp;&amp;amp; [MD] &amp;lt;= __kMD )
                VAR __IDs = DISTINCT( FILTER( UNION( SELECTCOLUMNS( __Table, "ID", [ID1] ), SELECTCOLUMNS( __Table, "ID", [ID2] ) ), [ID] &amp;lt;&amp;gt; __ID ) )
                VAR __Table1 = FILTER( __Table5, [ID] IN __IDs )
                VAR __Result = DIVIDE( SUMX( __Table1, [LRD] ), __Kneighborhood ) * DIVIDE(1, __LRD)
            RETURN
                __Result
        )
    VAR __Result = MAXX(FILTER(__Table6, [ID] = __ID), [LOF])
RETURN
    __Result&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;div data-video-id="https://youtu.be/q6p0JtZaplM" data-video-remote-vid="https://youtu.be/q6p0JtZaplM" class="lia-video-container lia-media-is-center lia-media-size-medium"&gt;&lt;iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2Fq6p0JtZaplM%3Ffeature%3Doembed&amp;amp;display_name=YouTube&amp;amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Dq6p0JtZaplM&amp;amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2Fq6p0JtZaplM%2Fhqdefault.jpg&amp;amp;type=text%2Fhtml&amp;amp;schema=youtube" allowfullscreen="" style="max-width: 100%"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="reportid hidden"&gt;eyJrIjoiYjRiMjUyODMtZmFjNy00MjVmLTk5OGEtOWNiMDc0NGNmMGQ0IiwidCI6IjRhMDQyNzQzLTM3M2EtNDNkMi04MjdiLTAwM2Y0YzdiYTFlNSIsImMiOjN9&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 16 May 2023 16:36:06 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Quick-Measures-Gallery/Anomaly-Detection-Local-Outlier-Factor/m-p/3238406#M976</guid>
      <dc:creator>Greg_Deckler</dc:creator>
      <dc:date>2023-05-16T16:36:06Z</dc:date>
    </item>
  </channel>
</rss>

