資源簡介
PARZEN窗和K近鄰算法的python實現。
現實生活中常常會有這樣的問題:缺乏足夠的先驗知識,因此難以人工標注類別或進行人工類別標注的成本太高。很自然地,我們希望計算機能代我們完成這些工作,或至少提供一些幫助。根據類別未知(沒有被標記)的訓練樣本解決模式識別中的各種問題,稱之為無監督學習。
現實生活中常常會有這樣的問題:缺乏足夠的先驗知識,因此難以人工標注類別或進行人工類別標注的成本太高。很自然地,我們希望計算機能代我們完成這些工作,或至少提供一些幫助。根據類別未知(沒有被標記)的訓練樣本解決模式識別中的各種問題,稱之為無監督學習。
代碼片段和文件信息
import?math
import?numpy?as?np
import?matplotlib.pyplot?as?plt
from?mpl_toolkits.mplot3d?import?Axes3D?
#%matplotlib?inline
def?eudistance(x?y):
????return?np.sqrt(np.sum(np.square(x?-?y)))
????
#計算超球體的超球體
def?calcualate_V(rd):
????if?d?==?1:
????????return?2?*?r
????elif?d?==?2:
????????return?math.pi?*?(r?**2)
????elif?d?%?2?==?0:
????????k?=?d?/?2
????????return?(math.pi?**?k)?*?(r?**?d)?/?(math.factorial(k))
????else:
????????k?=?(d?-?1)?/?2
????????return?(math.pi?**?k)?*(2?**?(2?*?k?+?1))?*?(math.factorial(k))?*?(r?**?d)?/?(math.factorial(2?*?k?+?1))
def?cube(u):
????u?=?np.abs(u)
????if?(u?<=?0.5).all():
????????return?1
????return?0
def?knn(Data?X?kn?d?f):
????n?=?len(Data)
????Prob?=?[]
????for?x?in?X:
????????dis?=?[]
????????for?s?in?Data:
????????????#dis.append(f(x?s))
????????????dis.append(abs(x-s))
????????dis.sort()
????????v?=?calcualate_V(dis[kn-1]d)
????????Prob.append(kn?/?(n?*?v))
????return?np.array(Prob)
def?parzen(Data?X?h?d?f):
????Prob?=?[]
????n?=?len(Data)
????for?x?in?X:
????????p?=?0.0
????????for?s?in?Data:
????????????p?+=?f((s?-?x)?/?h)
????????Prob.append(p?/?(n?*?(h**d)))
????return?np.array(Prob)
def?test_1D_KNN():
????
????Data?=?np.random.randn(100)
????X?=?np.arange(-5?5?0.01)
????plt.figure(dpi=200)
????Prob1?=?knn(Data?X?kn=10?*?2?d=1?f=eudistance)
????ax?=?plt.subplot(2?2?1)
????
????ax.set_title(“n=100“)
????ax.plot(X?Prob1)
????Data?=?np.random.randn(1000)
????Prob2?=?knn(Data?X?kn=32?*?5?d=1?f=eudistance)
????ax?=?plt.subplot(2?2?2)
????ax.set_title(“n=1000“)
????ax.plot(X?Prob2)
????Data?=?np.random.randn(10000)
????Prob3?=?knn(Data?X?kn=100?*?8?d=1?f=eudistance)
????ax?=?plt.subplot(2?2?3)
????ax.set_title(“n=10000“)
????ax.plot(X?Prob3)
????Data?=?np.random.randn(100000)
????Prob4?=?knn(Data?X?kn=316?*?10?d=1?f=eudistance)
????ax?=?plt.subplot(2?2?4)
????ax.set_title(“n=100000“)
????ax.plot(X?Prob4)
????plt.tight_layout()?#設置默認的間距
????plt.show()
def?test_1D_parzen():
????
????Data?=?np.random.randn(100)
????X?=?np.arange(-5?5?0.01)
????plt.figure(dpi=200)
????Prob1?=?parzen(Data?X?h=2.5?d=1?f=cube)
????ax?=?plt.subplot(2?2?1)
????
????ax.set_title(“n=100“)
????ax.plot(X?Prob1)
????Data?=?np.random.randn(1000)
????Prob2?=?parzen(Data?X?h=2.5?d=1?f=cube)
????ax?=?plt.subplot(2?2?2)
????ax.set_title(“n=1000“)
????ax.plot(X?Prob2)
????Data?=?np.random.ran
評論
共有 條評論