The point of all this is that a single transaction that connects two addresses together is not necessarily enough to link two businesses together, absent additional evidence.
The paper addresses this issue:
Although someone would use the CoinJoin method [9] to combine UTXOs from multiple senders into a single transaction to make it more challenging to determine the relationship between input and output addresses, we detect this method has not been adopted by the exchange so far.
I don't think this is a valid assumption. A CJ transaction can consist of two inputs, each from different entities. In 2013, many exchanges were not as professional as they are today, and were dealing with much less customer money.
The OP appears to be interested in weeding out exchanges with fake volume. An exchange with fake volume could possibly pay a whale to conduct a small number of Coin Join transactions to evade detection of their fake volume.
Also, a classification model that is accurate 96% of the time (it is unclear how you are measuring accuracy) has very high accuracy. My first reaction to that high of claimed accuracy is that you might have
data leakage. I can't point to the source without looking at your specific steps to train your model, which understandably may not be something you want to share.
I suppose they are presenting a model more than a software. So far, the model seems to me to be solid up to the extent that a good heuristic-based data mining model could be. The implementation is not open and it is not good news, so the results presented are highly suspicious.
For example, consider a conspiracy theory to be true: A shady exchange (such as Bittrex) with very low liquidity and a high incentive to put itself in the top 10 list and faking high volumes of trade, as a part of its scam, hires a team of technical writers and they publish an acceptable analysis model and faking privately generated results in favor of the exchange.
I would recommend that you learn about
machine learning. The Wikipedia article will tell you about ML but will be insufficient for you to be able to speak to it coherently.
The CoinJoin problem is really hard to solve. But as we see, nowadays, there is actually no/few CoinJoin in exchanges, especially big exchanges.
This paper has been peer-reviewed by some experts. They also addressed the issue of CoinJoin. But I cannot find a way to solve this issue.
You are correct, the CJ problem is difficult to solve programmatically. You could rule out transactions that have inputs from unique addresses above a threshold and unique output addresses above a threshold. This would not address Bob and Alice's exchange (who is faking volume) from broadcasting a single CJ transaction with two inputs and two outputs.
Once you find address clusters, you could remove a percentage of transactions associated with each address cluster in your data set, and re-run your cluster analysis. If a high enough percentage of addresses are no longer part of the cluster with transactions excluded, you can either flag the address cluster for closer analysis separately, or you can do something such as looping through each transaction that connects the cluster, and each loop removes a single transaction and adds the previous transaction back in (each loop assumes exactly one transaction is removed). If enough loops produce distinct, large clusters, then you may have a 'hidden' CJ transaction.
Obviously the above would be very expensive computational wise and is Big O squared. You might be able to make different assumptions that would make your function more efficient.