设为首页 收藏本站
查看: 1101|回复: 0

[经验分享] python实现数据的多维缩放(集体智慧编程)

[复制链接]

尚未签到

发表于 2017-5-6 12:56:48 | 显示全部楼层 |阅读模式
  多维缩放可以为数据集找到一种二维表达形式。算法根据每对数据项之间的差距情况,尝试绘制出一幅图来,图中的各数据项之间的距离远近,对应于它们彼此间的差异程度。
  以分类聚集算法中的数据为例
  第一步:计算所有数据项两两间的实际距离(可参考皮尔逊算法或欧几里德算法)
  第二步:将数据项随机放置在二维图上。
  第三步:针对每两两构成的一对数据项,将它们的实际距离与当前在二维图上的距离进行比较,求出一个误差值
  第四步:根据误差的情况,按照比例将每个数据项的所在位置移近或移远少许量。(每一个节点的移动,都是所有其它节点施加在该节点上的推或拉的结合效应。)
  第五步:重复第三步、第四步(节点每移动一次,其当前距离与实际距离的差距就会减少一些)。这一过程会不断地重复多次,直到无法再通过移动节点来减少总体误差为止。
  下面我们用PYTHON来实现此算法:

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')
  利用之前算法已得的数据进行测试下:

#encoding=utf-8
import clusters
blognames,words,data = clusters.readfile('blogdata1.txt')
coords = clusters.scaledown(data)
clusters.draw2d(coords,blognames)
  得到图:
  
DSC0000.jpg
 
 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-373839-1-1.html 上篇帖子: 【Python真的很强大】程序Log实时监控 下篇帖子: 微信公共平台框架-python(支持多账号)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表