Если вы не хотите использовать класс, производный от StringWriter
, то в вашем случае вы можете просто установить OmitXmlDeclaration
в false
и объявить свой собственный, как я делаю ниже:
public static string Serialize<T>(this T value, string xmlDeclaration = "<?xml version=\"1.0\"?>") where T : class, new()
{
if (value == null) return string.Empty;
using (var stringWriter = new StringWriter())
{
var settings = new XmlWriterSettings
{
Indent = true,
OmitXmlDeclaration = xmlDeclaration != null,
};
using (var xmlWriter = XmlWriter.Create(stringWriter, settings))
{
var xmlSerializer = new XmlSerializer(typeof(T));
xmlSerializer.Serialize(xmlWriter, value);
var sb = new StringBuilder($"{Environment.NewLine}{stringWriter}");
sb.Insert(0, xmlDeclaration);
return sb.ToString();
}
}
Вот байесовское вычисление и один пример / тест:
def estimateProbability(priorProbs, buyCount, noBuyCount):
# first, estimate the prob that the actual buy/nobuy counts would be observed
# given each of the priors (times a constant that's the same in each case and
# not worth the effort of computing;-)`
condProbs = [p**buyCount * (1.0-p)**noBuyCount for p in priorProbs]
# the normalization factor for the above-mentioned neglected constant
# can most easily be computed just once
normalize = 1.0 / sum(condProbs)
# so here's the probability for each of the prior (starting from a uniform
# metaprior)
priorMeta = [normalize * cp for cp in condProbs]
# so the result is the sum of prior probs weighed by prior metaprobs
return sum(pm * pp for pm, pp in zip(priorMeta, priorProbs))
def example(numProspects=4):
# the a priori prob of buying was either 0.3 or 0.7, how does it change
# depending on how 4 prospects bought or didn't?
for bought in range(0, numProspects+1):
result = estimateProbability([0.3, 0.7], bought, numProspects-bought)
print 'b=%d, p=%.2f' % (bought, result)
example()
вывод:
b=0, p=0.31
b=1, p=0.36
b=2, p=0.50
b=3, p=0.64
b=4, p=0.69
, что согласуется с моими ручными вычислениями для этого простого случая. Обратите внимание, что вероятность покупки, по определению, всегда будет между наименьшей и наибольшей среди набора априорных вероятностей; Если это не то, что вы хотите, вы можете ввести небольшую выдумку, представив два «псевдопродукта»: один, который никто никогда не купит (p = 0,0), и тот, который всегда будет покупать (p = 1,0) - это дает большее значение имеют фактические наблюдения, какими бы редкими они ни были, и меньшее значение для статистики прошлых продуктов. Если мы сделаем это здесь, мы получим:
b=0, p=0.06
b=1, p=0.36
b=2, p=0.50
b=3, p=0.64
b=4, p=0.94
Промежуточные уровни подделки (чтобы учесть маловероятный, но не невозможный шанс того, что этот новый продукт может быть хуже любого из когда-либо проданных ранее,
Самый простой способ сделать это без сложной математики - искусственно увеличить buyCount и noBuyCount путем добавления виртуальных клиентов, которые либо купили, либо не купили продукт. Вы можете настроить, насколько вы верите в каждую конкретную априорную вероятность с точки зрения того, сколько виртуальных клиентов, по вашему мнению, это стоит.
В псевдокоде:
def estimateProbability(priorProbs, buyCount, noBuyCount, faithInPrior=None):
if faithInPrior is None: faithInPrior = [10 for x in buyCount]
adjustedBuyCount = [b + p*f for b,p,f in
zip(buyCount, priorProbs, faithInPrior]
adjustedNoBuyCount = [n + (1-p)*f for n,p,f in
zip(noBuyCount, priorProbs, faithInPrior]
return [b/(b+n) for b,n in zip(adjustedBuyCount, adjustedNoBuyCount]
Похоже, вы пытаетесь сделать Обучение правилам ассоциации . У меня сейчас нет времени предоставить вам какой-либо код, но я укажу вам направление WEKA , который представляет собой фантастический набор инструментов для сбора данных с открытым исходным кодом для Java. Там вы найдете много интересного, что поможет вам решить вашу проблему.
На мой взгляд, лучший вы можете использовать равномерный дистрибутив, если у вас нет каких-либо подсказок относительно распределения. Или вы говорите об установлении связи между этими товарами и товарами, ранее купленными одним и тем же человеком в Amazon Fashion «люди, которые покупают этот товар, также покупают ...» ??