我正在研究推荐系统。这将是一个 Android 应用程序,用户将在其中输入他们的偏好,并根据这些偏好,向该用户显示其他匹配的配置文件。我正在从用户那里获取数据并将其存储在 Firebase 中。
这些是数值,为了向该用户显示匹配的个人资料,我使用两种算法来计算用户之间的相似度计数:
Cosine similarity
和Pearson correlation
我从应用程序中获取算法的名称,然后执行该算法以便向用户显示类似的配置文件。
if (request.query.algo === "cosine") {
// compute cosine value
}
else if (request.query.algo === "pearson-correlation") {
// compute pearson correlation coefficents
}
由于它将是一个实时应用程序,所以这种方法是完全错误的,我想实现策略设计模式,其中算法可以在运行时而不是编译时决定。
那么现在的问题是,在策略设计模式中,我如何决定何时使用哪种算法?
例如,当您使用信用卡购买商品时,信用卡的类型并不重要。所有信用卡都有一个磁条,其中包含编码信息。这些条带及其包含的内容代表“接口”,卡的类型代表“实现”。每张信用卡都可以替换为任何其他信用卡,并且所有信用卡都完全独立。
同样,在策略设计模式的运行时,我应该基于什么基础在 Cosine 和 Pearson 之间进行选择?
根据我的理解,在两个用户配置文件具有非常不同的项目集(在本例中为偏好设置)的情况下,Pearson 的表现会更差。
也许这可能是您的标准?如果匹配偏好的数量高于某个阈值,则使用 Pearson,而对于其他情况,则使用余弦。
您也许可以向用户显示一个接近匹配列表,该列表使用余弦来向用户显示其个人资料有很多共同点。
然后您可以显示第二个列表,其中显示“您可能也感兴趣”,该列表使用 Pearson 来显示没有很多共同偏好的匹配个人资料。
public interface SortingStrategy {
void sort(int[] numbers);
}
public class BubbleSortStrategy implements SortingStrategy {
@Override
public void sort(int[] numbers) {
// Bubble sort algorithm
int n = numbers.length;
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (numbers[j] > numbers[j + 1]) {
int temp = numbers[j];
numbers[j] = numbers[j + 1];
numbers[j + 1] = temp;
}
}
}
}
}
public class Context {
private SortingStrategy strategy;
public void setStrategy(SortingStrategy strategy) {
this.strategy = strategy;
}
public void executeStrategy(int[] numbers) {
strategy.sort(numbers);
}
}
用法示例:
public class Main {
public static void main(String[] args) {
int[] numbers = {5, 3, 8, 1, 2};
Context context = new Context();
// Using BubbleSortStrategy
context.setStrategy(new BubbleSortStrategy());
context.executeStrategy(numbers);
// Print sorted numbers (Bubble sort result)
for (int number : numbers) {
System.out.print(number + " ");
}
}
}