并不是标准的极大似然法…是魔改的而且效果并比不上人工拟合

因为如果使用标准平均值作为高斯分布的μ,对于中心不在平均点的数据不能很好的拟合

所以改用加权平均

μ = ∑(i=1 to n)(Ai * P(Ai)) 其中P(Ai) 为Ai数值在整个数据集中的出现概率

σ = ∑(i=1 to n)((Ai – μ)^2 * P(Ai))* len(A)   其中len(A)为数据种数

直接采用加权方差并不能很好的得到曲线

效果大概:(从1-100 中心点在34-35左右的数据集)

27e30406-aad8-4301-bdd7-36d94f836831

但是貌似对数据缺失没有很好的鲁棒性

接下来应该会去尝试贝叶斯参数估计方法(有点难。。。好难。。。非常难)

这个纯属写着玩= = 没有任何数据依据

import numpy as np
import pylab as pl
from math import sqrt, exp

input_data = []


def read_data(file):
    lines = [line for line in open(file, 'r')]

    for line in lines:
        data = line.split(',')
        input_data.append((int(data[0]), int(data[1])))


def get_data_count():
    data_sum = 0

    for (i, data) in input_data:
        data_sum += data

    return data_sum


def get_avg():
    sum = 0
    gl = get_gl()
    for (a, b) in input_data:
        sum += a * gl[a]

    return sum


def get_gl():
    data_sum = get_data_count()

    result = {u: l / data_sum for (u, l) in input_data}
    return result


def get_jdsrfb():
    N = get_avg()
    gl = get_gl()
    sum = 0;

    for (u, l) in input_data:
        sum += (u - N) * (u - N) * gl[u]

    sum /= len(input_data)
    return N, sum * 100


def get_gaosi(u, N, n):
    PI = 3.14159265358979323
    return 1 / (sqrt(2 * PI) * sqrt(N)) * exp(-(n - u) * (n - u) / (2 * N))


def draw_pic(U, N):
    x_source = []
    y_source = []
    y_target = []
    gl = get_gl()
    for (u, l) in input_data:
        x_source.append(u)
        y_source.append(gl[u])
        y_target.append(get_gaosi(U, N, u))

    pl.plot(x_source, y_source, 'r')
    pl.plot(x_source, y_target, 'g')
    pl.show()


read_data('test.csv')
u, N = get_jdsrfb()
draw_pic(u, N)