def scaledown(data, distance=pearson, rate=0.01):
n = len(data)
print n
# 每一对数据项的真实距离
realdist = [[distance(data, data[j]) for j in range(n)]
for i in range(0, n)]
# 生成随机的二维LIST,表示各数据项在二维空间的初始坐标
loc = [[random.random(), random.random()] for i in range(n)]
fakedist = [[0.0 for j in range(n)] for i in range(n)]
lasterror = None
for m in range(0, 100000):
# 计算各数据项初始坐标的距离
for i in range(n):
for j in range(n):
fakedist[j] = sqrt(sum([pow(loc[x] - loc[j][x], 2) for x in range(len(loc))]))
# Move points
grad = [[0.0, 0.0] for i in range(n)]
totalerror = 0
for k in range(n):
for j in range(n):
if j == k:
continue
# 计算误差的比例
errorterm = (fakedist[j][k] - realdist[j][k]) / realdist[j][k]
# Each point needs to be moved away from or towards the other
# point in proportion to how much error it has
grad[k][0] += (
(loc[k][0] - loc[j][0]) / fakedist[j][k]) * errorterm
grad[k][1] += (
(loc[k][1] - loc[j][1]) / fakedist[j][k]) * errorterm
# 求得所有数据项的误差和
totalerror += abs(errorterm)
# 如果移动后,误差变得更大,则结束
if lasterror and lasterror < totalerror:
break
lasterror = totalerror
# 移动节点
for k in range(n):
loc[k][0] -= rate * grad[k][0]
loc[k][1] -= rate * grad[k][1]
return loc
//作图的方法
def draw2d(data, labels, jpeg='mds2d.jpg'):
img = Image.new('RGB', (1000, 1000), (255, 255, 255))
draw = ImageDraw.Draw(img)
#设置字体类型与大小
font = ImageFont.truetype('simsun.ttc', 24)
for i in range(len(data)):
x = (data[0] + 0.5) * 500
y = (data[1] + 0.5) * 500
#此处注意编码
draw.text((x, y), unicode(labels, 'utf-8'), (0, 0, 0), font=font)
img.save(jpeg, 'JPEG')
利用之前算法已得的数据进行测试下: