资源简介
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
评论
共有 条评论