小编Rya*_*yan的帖子

在numpy数组上映射函数的最有效方法

在numpy数组上映射函数的最有效方法是什么?我在当前项目中一直这样做的方式如下:

import numpy as np 

x = np.array([1, 2, 3, 4, 5])

# Obtain array of square of each element in x
squarer = lambda t: t ** 2
squares = np.array([squarer(xi) for xi in x])
Run Code Online (Sandbox Code Playgroud)

但是,这看起来可能非常低效,因为我使用列表解析将新数组构造为Python列表,然后再将其转换回numpy数组.

我们可以做得更好吗?

python performance numpy

264
推荐指数
9
解决办法
32万
查看次数

朴素贝叶斯与SVM对文本数据进行分类

我正在研究一个涉及对大型文本数据库进行分类的问题.文本很短(每个3-8个单词),有10-12个类别,我希望对它们进行排序.对于这些功能,我只是使用每个单词的tf-idf频率.因此,特征的数量大致等于文本中整体出现的单词的数量(我正在删除停用词和其他一些词).

在尝试使用模型时,我有以下两个想法:

  • 朴素贝叶斯(可能是sklearn多项式朴素贝叶斯实施)
  • 支持向量机(在训练中使用随机梯度下降,也是sklearn实现)

我已经建立了两个模型,目前正在比较结果.

每种模型的理论优缺点是什么?为什么其中一个可以更好地解决这类问题?我是机器学习的新手,所以我想了解的是为什么人们会做得更好.

非常感谢!

theory machine-learning scikit-learn supervised-learning

14
推荐指数
2
解决办法
2万
查看次数

使用向量化将函数应用于 Numpy 二维数组中的每一行

我调用了一个 1000x784 的数据矩阵(10000 个示例和 784 个特征)X_valid,我想将以下函数应用于该矩阵中的每一行并获得数值结果:

def predict_prob(x_valid, cov, mean, prior):
    return -0.5 * (x_valid.T.dot(np.linalg.inv(cov)).dot(x_valid) + mean.T.dot(
    np.linalg.inv(cov)).dot(mean) + np.linalg.slogdet(cov)[1]) + np.log(
    prior)
Run Code Online (Sandbox Code Playgroud)

x_valid只是一行数据)。我使用 numpyvectorize通过以下代码来执行此操作:

v_predict_prob = np.vectorize(predict_prob)
scores = v_predict_prob(X_valid, covariance[num], means[num], priors[num])
Run Code Online (Sandbox Code Playgroud)

covariance[num]means[num]、 和priors[num]只是常数。)

但是,运行时出现以下错误:

File "problem_5.py", line 48, in predict_prob
return -0.5 * (x_valid.T.dot(np.linalg.inv(cov)).dot(x_valid) + mean.T.dot(np.linalg.inv(cov)).dot(mean) + np.linalg.slogdet(cov)[1]) + np.log(prior)
AttributeError: 'numpy.float64' object has no attribute 'dot'
Run Code Online (Sandbox Code Playgroud)

也就是说,它不会单独传递矩阵的每一行。相反,它传递矩阵的每个条目(不是我想要的)。

我怎样才能改变它以获得所需的行为?

numpy vectorization

6
推荐指数
1
解决办法
2913
查看次数

无法将(int,double)对添加到HashMap <Integer,Double>

我现在正在开发一个Java项目,我有一个名为DistanceQueue的类.它的签名是由

public class DistanceQueue<Integer> extends PriorityQueue<Integer>
Run Code Online (Sandbox Code Playgroud)

在这个课程中,有一种方法

public boolean add(int v)
Run Code Online (Sandbox Code Playgroud)

它将键值对(v,Double.MAX_VALUE)添加到名为DistanceQueue类的称为距离的HashMap中.但是,在add(int v)里面,当我输入时

distances.put(v, Double.MAX_VALUE);
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

DistanceQueue.java:98: error: no suitable method found for put(int,double)
            distances.put(v, Double.MAX_VALUE);
                     ^
    method HashMap.put(Integer,Double) is not applicable
      (actual argument int cannot be converted to Integer by method invocation conversion)
  where Integer is a type-variable:
    Integer extends Object declared in class ShortestPaths.DistanceQueue
1 error
Run Code Online (Sandbox Code Playgroud)

有谁知道我为什么会收到这个错误?我认为Java会自动在int和Integer之间进行转换.有一种简单的方法可以解决它吗?

谢谢!

java types

5
推荐指数
1
解决办法
802
查看次数

引用全局原语与对象

有人可以用Python解释一下下面的结果吗?

当运行以下代码片段时,Python 会抛出错误,指出该变量x在赋值之前被引用:

x = 1

def increase_x():
    x += 1

increase_x()
Run Code Online (Sandbox Code Playgroud)

当然,解决方案是global x在 的函数声明之后包含该行increase_x

但是,当运行下一段代码时,没有错误,结果正如您所期望的:

x = [2, -1, 4]

def increase_x_elements():
    for k in range(len(x)):
        x[k] += 1

increase_x_elements()
Run Code Online (Sandbox Code Playgroud)

这是因为整数在Python中是基元(而不是对象),所以x在第一个片段中是存储在内存中的基元,而x在第二个片段中引用了指向列表对象的指针?

python pointers global

5
推荐指数
1
解决办法
740
查看次数

边加权倍增后的最短路径

假设我们有一个加权有向图G,我们使用A*搜索或任何其他最短路径算法找到了G中顶点u和v之间的最短路径.现在假设我们将G中的所有边权重加倍.最短路径是否会改变?

我的论点如下:最短路径不会改变.调用原始路径P并假设存在从u到v的第二个不同的路径P',使得在加倍边缘的权重之后,P'比P短.然后,

    weight(P') < weight(P)
Run Code Online (Sandbox Code Playgroud)

双倍之后.然而,将双方除以2我们看到P'在加倍之前必须也更短,因此P不是开始的最短路径而且我们有矛盾.因此,在加倍边缘权重之后,P仍然是最短路径.

有人会批评这个解决方案吗?这是对的吗?

algorithm graph shortest-path

5
推荐指数
1
解决办法
959
查看次数

Python for循环 - 为什么这不是无限循环?

考虑以下Python代码片段:

x = 14
for k in range(x):
    x += 1
Run Code Online (Sandbox Code Playgroud)

在执行结束时,x等于28.

我的问题:这段代码不应该永远循环吗?在每次迭代时,它会检查是否k小于x.但是,x在for循环中递增,因此它具有较高的值用于下一次比较.

python for-loop infinite-loop

5
推荐指数
2
解决办法
130
查看次数

在 Python 中为字典实现 argmin

以前可能有人问过这个问题,但是有人知道在 Python 中实现 argmin 的优雅方法吗?也就是说,给定一个将整数映射到整数的字典 D,我想找到键 k 使得 D[k] 最小化。

例如:

d = {1: 100, 2:200}
argmin(d) = 1
Run Code Online (Sandbox Code Playgroud)

python dictionary function

2
推荐指数
1
解决办法
6500
查看次数

NumPy中的数组索引没有意义

我有一个大小的numpy数组28x28x60000.请注意以下事项:

>>> X.shape
(28, 28, 60000)
>>> X[:][:][0].shape
(28, 60000)
Run Code Online (Sandbox Code Playgroud)

不应该X[:][:][0]是一个大小的数组28x28?我们包括前两个维度(每个28个)的每个组件,但只包括第三个维度的第0个条目.

这里发生了什么?

python indexing numpy

2
推荐指数
1
解决办法
455
查看次数

使用具有相同成员函数名称的 CRTP

当我看到使用的 CRTP 模式时,似乎在基类型中调用的函数名称总是指向派生类型中不同名称的实现函数(例如:foo()in base 进行调用static_cast<DerivedType*>(this)->foo_implementation();.

有没有办法使用相同的函数名来实现 CRTP 模式?我有一个较长的继承链,其中函数可能在链的第一级没有具体实现,因此必须使用不同的函数名称不是很干净/可读。

我想要有如下的东西:

template <typename SecondType>
struct FirstType {

    void foo() {
        static_cast<SecondType*>(this)->foo();
    }

};

template <typename ThirdType>
struct SecondType : FirstType<SecondType> {

    void foo() {
        static_cast<ThirdType*>(this)->foo();
    }

};

struct ThirdType : SecondType<ThirdType> {

    void foo() {
        // Concrete implementation here
    }

};
Run Code Online (Sandbox Code Playgroud)

当然,编译器不会抱怨这一点,但我想它会导致隐式 vtable 查找(尽管关键字virtual没有出现),从而违背了使用 CRTP 的目的。

c++ inheritance crtp

2
推荐指数
1
解决办法
556
查看次数