我正在编写一个WebSocket服务器,其中一个Web客户端连接到多线程计算机AI上下棋.WebSocket服务器想要将Logger
对象传递给AI代码.该Logger
对象将管理从AI到Web客户端的日志行.在Logger
必须包含对客户端连接的参考.
我对生命周期如何与线程交互感到困惑.我用Wrapper
类型参数化的结构重现了这个问题.该run_thread
函数尝试解包该值并记录它.
use std::fmt::Debug;
use std::thread;
struct Wrapper<T: Debug> {
val: T,
}
fn run_thread<T: Debug>(wrapper: Wrapper<T>) {
let thr = thread::spawn(move || {
println!("{:?}", wrapper.val);
});
thr.join();
}
fn main() {
run_thread(Wrapper::<i32> { val: -1 });
}
Run Code Online (Sandbox Code Playgroud)
该wrapper
参数存在于堆栈中,并且它的生命周期不会延伸超过run_thread
堆栈帧,即使该线程将在堆栈帧结束之前连接.我可以从堆栈中复制值:
use std::fmt::Debug;
use std::thread;
struct Wrapper<T: Debug + Send> {
val: T,
}
fn run_thread<T: Debug + Send + 'static>(wrapper: Wrapper<T>) {
let thr = thread::spawn(move || …
Run Code Online (Sandbox Code Playgroud) 我想学习Naive Bayes模型,解决类是布尔值的问题(取两个值中的一个).某些功能是布尔值,但其他功能是分类的,可以采用少量值(~5).
如果我的所有功能都是布尔值,那么我想使用sklearn.naive_bayes.BernoulliNB
.似乎很清楚,sklearn.naive_bayes.MultinomialNB
是不是我想要的.
一种解决方案是将我的分类特征拆分为布尔特征.例如,如果变量"X"取值"红色","绿色","蓝色",我可以有三个变量:"X是红色","X是绿色","X是蓝色".这违反了给予类的变量的条件独立性假设,因此它似乎完全不合适.
另一种可能性是将变量编码为实值变量,其中0.0表示红色,1.0表示绿色,2.0表示蓝色.这似乎完全不适合使用GaussianNB(出于显而易见的原因).
我想要做的事情似乎并不奇怪,但我不明白如何将它融入sklearn给我的Naive Bayes模型中.我自己编写代码很容易,但是如果可能的话,我更喜欢使用sklearn,原因很明显(大多数:避免错误).
[编辑解释为什么我不认为多项式NB是我想要的]:
我的理解是,在多项式NB中,特征向量包括在k
iid样本中观察到令牌的次数.
我的理解是,这适用于分类文档,其中存在基础类文档,然后假定文档中的每个单词都是从特定于该类的分类分布中提取的.文档将具有k
令牌,特征向量的长度将等于词汇量大小,并且特征计数的总和将是k
.
就我而言,我有一些bernoulli变量,加上几个分类变量.但这里没有"计数"的概念.
示例:课程是喜欢或不喜欢数学的人.预测因子是大学专业(分类)以及他们是否进入研究生院(布尔).
我认为这不符合多项式,因为这里没有任何重要性.
Horse
是一个实现Animal
特征的结构.我有一个Rc<Horse>
和一个需要接受的功能Rc<Animal>
,所以我想转换Rc<Horse>
为Rc<Animal>
.
我这样做了:
use std::rc::Rc;
struct Horse;
trait Animal {}
impl Animal for Horse {}
fn main() {
let horse = Rc::new(Horse);
let animal = unsafe {
// Consume the Rc<Horse>
let ptr = Rc::into_raw(horse);
// Now it's an Rc<Animal> pointing to the same data!
Rc::<Animal>::from_raw(ptr)
};
}
Run Code Online (Sandbox Code Playgroud)
这是一个好的解决方案吗?这是对的吗?