استاد ، تابع kl رو تعریف کردین و واگرایی توزیع قد مردان و نرمال ایده آل رو سنجیدین.
این کار رو با تابع scipy.special.kl_div(x, y, out=None) مجدد انجام دادم تا نتیجه رو مقایسه کنم اما این تابع inf میده. چرا؟
سلام
هر کدام از نمونهها در x و y باید تقسیم بر جمع کل بشوند تا به حالت احتمالی تبدیل شوند
احتمالا این کار رو نکردید برای این تابع
استاد متوجه نشدم. این کد رو نوشتم. ممنون میشم روی کد راهنمایی بفرمایید:
import numpy as np
import pandas as pd
from scipy.stats import norm
from scipy.special import kl_div
def kl(p,q):
result= np.sum(np.where(np.logical_and(p!=0,q!=0),p*np.log(p/q),0))
return result
data= pd.read_csv('E:\\\\Python\\\\DataSets\\\\weight-height.csv')
males= data[data['Gender']=='Male']['Height']
m_mean= males.describe()['mean']
m_std= males.describe()['std']
count, division= np.histogram(males, bins=100)
count= count/len(males)
idata= norm.rvs(size=len(males),loc=m_mean,scale=m_std)
icount, idivision= np.histogram(idata, bins=100)
icount= icount/len(idata)
print(kl(count, icount))
print(kl_div(count, icount))
اهان بعضی از عناصر توی این تابع inf میشن
بعد از اجرای خط کدهای بالا خط کدهای زیر را اجرا کنید
from numpy import inf klx = kl_div(count, icount) klx[klx == inf] = 0 print(sum(klx))
با این کار به جای Inf مقادیر صفر قرار میگیرد و سپس با جمع تمامی kl_divها عدد حدود ۰/۰۹ به دست میآید که نزدیک به همان قبلی است