#HDPoint.py
from functools import reduce
import random
class HDPoints:
def __init__(self,ls):
self.points=ls
def centerpoint(self):
cpoint=[]
lenth=len(self.points[0])
for i in range(lenth):
cpoint.append(reduce(lambda a,b:a[i]+b[i],self.points))/float(len(self.points))
return cpoint
def minkowski(self,x,y,p):
sum=0
for i in range(len(x)):
sum+=abs(x[i]-y[i])**p
if p!=0:
return sum**(1/p)
else:
return sum
def farthestpoint(self,p):
cpoint=self.centerpoint()
maxk=0
for i in range(len(self.points)):
s=self.minkowski(cpoint,self.points[i],p)
if s>self.minkowski(cpoint,self.points[maxk],p):
maxk=i
return (maxk,s)
def farthest2point(self,p):
maxspoints=[]
maxs=0
for i in range(len(self.points)-1):
for j in range(i+1,len(self.points)):
s=self.minkowski(self.points[i],self.points[j],p)
if s>maxs:
maxs=s
maxpoints=[i,j,maxs]
return maxpoints
points=[]
x=random.randint(50,100)
y=random.randint(5,10)
p=random.randint(0,6)
for i in range(x):
a=[]
for j in range(y):
a.append(random.random())
points.append(a)
#print(points)
hdpoints=HDPoints(points)
print(hdpoints.centerpoint())
print(hdpoints.minkowski(points[1],points[0],p))
print(hdpoints.farthestpoint(p))
print(hdpoints.farthest2point(p))
题目: 定义一个高维空间样本点集类HDPoints,须包含以下数据属性与方法属性:
(a)数据属性self.points:类型为列表,由多个子列表构成,每个子列表表示高维空间中的一个数据点,且数据维度可以任意,并通过初始化构造函数获得。
(b)方法属性centerpoint(self):计算点集的中心点。
(c)方法属性minkowski (self, x, y, p):计算两点x和y之间的闵可夫斯基距离,p为非负整数,用p=0情形表示切比雪夫距离。由此定义的距离称为p-闵氏距离,其数学定义如下:
(d)方法属性farthestpoint(self, p):找出离中心点p-闵氏距离最远的点,返回在self.points中的下标以及最大距离。
(e)方法属性farthest2points(self, p):找出点集self.points中p-闵氏距离最远的两点,返回两点在self.points中的下标及其最大距离。
接一下来,实例化类HDPoints,利用random模块,随机产生至少50个高维空间数据点,样本点的维度至少在5以上,且每个分量取值服从区间[0,1]上的均匀分布。同时,随机产生一个0~5之间的一个非负整数,赋值传递给p-闵氏距离函数中的参数p,对HDPoints实例对象的全部自定义方法属性(即centerpoint()、minkowski()、farthestpoint()和farthest2points())进行功能测试。