Вы используете количество ячеек по умолчанию для своей гистограммы и, как я предполагаю, для расчетов оценки плотности ядра.
В зависимости от того, сколько точек данных у вас есть, это определенно не будет оптимальным, как вы обнаружили. Первое, что нужно попробовать, это рассчитать оптимальную ширину бина. чтобы получить самую плавную кривую, одновременно сохраняя базовый PDF как можно лучше. (см. также здесь, здесь и здесь);
Если вам по-прежнему не нравится, насколько гладким получается график, вы можете попробовать использовать выходные данные bins
из hist
в качестве дополнительных входных данных для ksdensity
. Возможно что-то вроде этого:
[kcounts,kbins] = ksdensity(data,bins,'npoints',length(bins));
У меня нет ваших данных, поэтому вам, возможно, придется немного поиграть с параметрами, чтобы получить именно то, что вы хотите.
В качестве альтернативы вы можете попробовать разместить spline
по точкам, полученным из hist
, и вместо этого построить график.
Некоторый код:
data = randn(1,1e4);
optN = sshist(data);
figure(1)
[N,Center] = hist(data);
[Nopt,CenterOpt] = hist(data,optN);
[f,xi] = ksdensity(data,CenterOpt);
dN = mode(diff(Center));
dNopt = mode(diff(CenterOpt));
plot(Center,N/dN,'.-',CenterOpt,Nopt/dNopt,'.-',xi,f*length(data),'.-')
legend('Default','Optimum','ksdensity')
Результат:
Обратите внимание, что «оптимальная» ширина бина сохраняет некоторую тонкую структуру распределения (мне пришлось запустить это пару раз, чтобы получить пики), в то время как ksdensity
дает гладкую кривую. В зависимости от того, что вы ищете в своих данных, это может быть как хорошо, так и плохо.
person
craigim
schedule
26.05.2014