我正在尝试逐个比较客户,其质量可以通过二元选择来定义(例如客户是否使用产品)。
在网上搜索了很多之后,看起来我需要为此使用汉明距离,或者它的等价物:找到两个单词之间 XOR 运算结果的汉明权重。
举个具体的例子,1001 和 1011 之间的汉明距离:
计算数 1001 XOR 1011= 0010 0010
的汉明权重 = 1(0010 中设置为 1 的位数)
对于最多 96 位的字,我需要这样做。
我找到了一些关于
http://people.revoledu.com/kardi/tutorial/Similarity/HammingDistance.html
http://trustedsignal.blogspot.ca/2015/06/xord-play-normalized-hamming-distance.html
和大量的代码,例如
但仅限于 C、Java、Perl、O、opencl ......除了 Excel VBA 之外的任何东西。
到目前为止,这就是我设法整理的内容。
它有效,但不幸的是仅适用于 30 位或更少的单词,并且使用了一种有点粗略的方法:对两个数字 X 和 Y 进行异或,然后转换为表示二进制数的字符串。然后在取出 1 后计算字符串的长度。我想有一个更优雅和有效的方式。
Public Function HamDist(x As Long, y As Long, NbBit As Integer)
Dim i As Long, BinStrg As String, bxor As Long
bxor = x Xor y
BinStrg = ""
For i = NbBit To 0 Step -1 ‘going from left to right
If bxor And (2 ^ i) Then
BinStrg = BinStrg + "1" ‘add a 1 to the string
Else
BinStrg = BinStrg + "0"
End If
Next
HamDist = Len(BinStrg) - Len(Replace(BinStrg, "1", "")) ' replace the 1 by nothing and count the length of the resulting string
End Function
您能否通过计算汉明权重或距离来帮助使其适用于 Excel 2010及更低版本(udf 或 sub)的 VBA 中的 96 位字?