鱼C论坛

 找回密码
 立即注册
楼主: lightninng

[技术交流] [记录贴]每天的问题和解决方法_正确学习方法

[复制链接]
发表于 2015-4-14 02:18:37 | 显示全部楼层
lightninng 发表于 2015-4-13 23:01
哈哈,我之前也是时差党,被室友强行搬过来了,加油~~

我是确实在国外……时差12小时
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-14 17:25:19 | 显示全部楼层
d5zhao 发表于 2015-4-14 02:18
我是确实在国外……时差12小时

高大上的时差党~~加油吧~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-15 00:42:21 | 显示全部楼层
今天主要跑了kpca算法的高斯核,这部分的东西之后专门开个贴说吧,另外又把pyqt4入门教程敲了几章,发现竟然只有38页~~意外 的在搜原版的the pyqt4 tutorial 时找到了这个网站http://wiki.woodpecker.org.cn/moin/First_Programs_%E7%AC%AC%E4%B8%80%E4%B8%AA%E7%A8%8B%E5%BA%8F
虽然翻译的不咋好,但是也能看,之后的章节可能根据 这个贴子来写了,当然也会根据自己的语文水平对它的翻译做一些改进~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-15 05:47:46 | 显示全部楼层
支持lz
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-15 10:13:15 | 显示全部楼层

:handshake
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-16 00:00:34 | 显示全部楼层
本帖最后由 lightninng 于 2015-4-16 12:02 编辑

今天继续在跑kpca,高斯核跑完了,在跑多项式核,遇到个问题
在我的程序中得到了一个实对称的矩阵K(n*n),自己然后另外一个值全为1/n的矩阵one(n*n),然后得到新的矩阵K_new = K - K*one - one*K + one*K*one,这里的*表示矩阵乘法,按道理说这里的K_new矩阵应该是实对称矩阵,特征值应该为实数,但是我分析得到的特征值为复数,然后我将K_new中对应位置不相等的两个数用print函数打印出来,发现两个数一样,但是判断两数相等得到的结果是False,转成str类型后打印出来发现两个数最后一位差1,另外 wei_Y版主给予了帮助,最后总结成两点:
1、numpy的矩阵计算在做矩阵乘法时,精度上会有一些问题
2、print函数直接打印float变量时会做四舍五入处理,但是你把数据放在元组中刚打印出完整的结果
3、我遇到的问题的处理办法,找到一定相等的那一位,对矩阵中的所有变量做round处理,

Pyqt这两天是没功夫更新了,至少kpca跑完再看看~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-16 12:10:19 | 显示全部楼层
本帖最后由 lightninng 于 2015-4-16 13:34 编辑

还是昨天关于矩阵乘法导致的矩阵变成非对称矩阵的问题,虽然当时用round函数解决了,但是在后续的使用中,由于矩阵中的数字位数不同,导致,round函数中的第二个参数得调,而且在某一次怎么调也无法让矩阵达到要求,后面在网上看到round函数似乎也有一些小的偏差,最后自己找了个解决办法 是这样的
问题:两个浮点数最最后一位有小数字或两位有效数字有轻微差别,怎么截断后面不同的部分
解决办法 : 将两个数转为字符串,然后将前面相同 的部分提取出来转为float变量返回
  1.     def get_same_num(ij, ji):
  2.         s_1 = str(ij)
  3.         s_2 = str(ji)
  4.         for s_i in range(min([len(s_2), len(s_1)])):
  5.             if s_1[s_i] != s_2[s_i]:
  6.                 break
  7.         return numpy.float64(s_1[:s_i])  # 将截断后的string转为float返回
复制代码
对于矩阵所有的不相同元素作这样的处理,让矩阵达到实对称,由于本身舍弃的位数是float变量的最后1到两位,所以对运算结果没有太大影响


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-16 16:56:25 | 显示全部楼层
楼主正解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-16 23:59:02 | 显示全部楼层
本帖最后由 lightninng 于 2015-4-17 12:57 编辑

仍然在跟KPCA做斗争,果然把所学的东西投到应用中,问题很多很多,pyqt更新了一个小节,今天遇到一个问题,就是昨天转化为字符串处理的方法会导致一些问题,比如当它用科学计数法时,直接将e后面的截断了,导致错误,想到了一个解决办法 ,不过太晚了,困死,睡先~
补充一下,关于精度的问题,做了两点改进,一点是,把不相等的数字设为两个数字的平均值,二是,数字用科学计数法表示时的解决
  1.     def get_same_num(ij, ji):
  2.         # 将两个数都转为字符串,并按e分为两个部分
  3.         s_f1 = str(ij).split("e")
  4.         s_f2 = str(ji).split("e")
  5.         if len(s_f1) == 1:  # 若只有一个部分按之前的办法处理(即没有用科学计数法时的处理)
  6.             s_1 = list(s_f1[0])
  7.             s_2 = list(s_f2[0])
  8.             for s_i in range(min([len(s_2), len(s_1)])):
  9.                 if s_1[s_i] != s_2[s_i]:
  10.                         s_1[s_i] = s_2[s_i] = str(int((int(s_2[s_i]) + int(s_2[s_i]))/2))
  11.             return numpy.float64("".join(s_1[:s_i]))
  12.         else:  # 如果发现是用科学计数法,则将前半部分按之前的办法 处理,后半部分保存,最后合并
  13.             s_1, e_1 = list(s_f1[0]), s_f1[1]
  14.             s_2 = list(s_f2[0])
  15.             for s_i in range(min([len(s_2), len(s_1)])):
  16.                 if s_1[s_i] != s_2[s_i]:
  17.                         s_1[s_i] = s_2[s_i] = str(int((int(s_2[s_i]) + int(s_2[s_i]))/2))
  18.             return numpy.float64("e".join(["".join(s_1[:s_i]), e_1]))
复制代码
其实这里面有一部分是可以提出来专门写个嵌套函数复用的,代码行数会减少,但是自己没倒腾


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-19 22:39:09 | 显示全部楼层
本帖最后由 lightninng 于 2015-4-19 23:01 编辑

昨天更新了pyqt忘了更新这个贴子,最近几天是论文攻坚部分,另外要找工作了,看了一些东西
第一部分:了解自己
1、系统程序员还是应用开发者
系统程序员:支持计算机系统运行的程序,通常不涉及用户界面的工作,很少和非程序员交流
应用开发者:用户直接使用的程序,经常需要和非技术人员进行交流
2、是否喜欢用户界面
用户界面设计,用户体验(User Experience, UX)或人机交互(Human Computer Interaction, HCI)需要编程、图形设计以及心理学。
工作高调,是用户接触最多的部分,在移动应用中用户界面设计更为重要。
很难做的很好,易受批评,尤其把国际化和可访问性考虑在内的时候。
3、调试技能出色么
需要很强的分析和解决问题的能力。
凭借自身的力量找到并解决bug是非常的有益。
在老公司为了维护代码会学习一些比较老的技术,但是这样也会使出路变窄,同时也因为物以稀而贵。
4、喜欢测试么
质量保证(Quality Assurance, QA)。
确保测试用例覆盖使用程序的所有可能情况,同时生成开发人员没有考虑过的输入组合发现bug。
熟练的测试人员很少,编写测试工具和自动化测试用例需要很好的编程技能。
5、构架师还是编码人员
构架师需要理解如休编码,但会经常参加会议和人际交往,很少编代码。
参加过相关培训,或者先做程序员再转行
6、是否喜欢管理
如果喜欢管理,需要发展领导力的技能并能像管好技术部分一样管好人力部分。
如果不喜欢管理,寻找一个有良好技术发展通道的公司。
想要升职,领导力技能是必须的,它与管理技术是不一样的。
  • 领导力,指不管组织是否赋予他权力,都能合理协调人力资源,令具备各种能力的人发挥其最大能量,并甘心追随其左右,听其调遣的能力。
  • 管理能力,是指能够合理利用资源,通过计划、组织、协调、执行、指挥、控制等一系列操作,实现组织或个人目标的能力。
7、是否喜欢大公司
好处:更稳定的工作和好的职业发展通道,公司出名。
缺点:官僚作风、严格的制度、内部竞争激烈
8、是否喜欢小公司
好处:随着公司的发展,有可能带来晋升,工作环境宽松。
缺点:公司的发展好坏影响个人发展,有风险。9、是否希望从事开源软件项目
有些公司会开放软件开发过程,这给一些人提供了为开源项目工作的机会并且可能通过参与项目获得报酬。
10、喜欢长期还是短期项目
短期:渴望变化,不希望在同一个项目上花太多时间
长期:希望稳定的工作环境






想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-22 00:25:46 | 显示全部楼层
这几天忙着弄论文~~好吧,是借口,记不起来每天学了什么,自勉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-23 23:02:55 | 显示全部楼层
本帖最后由 lightninng 于 2015-4-25 19:41 编辑

1、如果想获得一个全排列,如1,2,3的全排列(即可以重复)应该是:111,112,113,121,122,123,131,132,133,
211,212,213,221,222,223,231,232,233,
311,312,313,321,322,323,331,332,333
方法:用itertools中的product函数
  1. >>> for each in itertools.product(range(3),range(3),range(3)):
  2.         print(each)
  3.         
  4. (0, 0, 0)
  5. (0, 0, 1)
  6. (0, 0, 2)
  7. (0, 1, 0)
  8. (0, 1, 1)
  9. (0, 1, 2)
  10. (0, 2, 0)
  11. (0, 2, 1)
  12. (0, 2, 2)
  13. (1, 0, 0)
  14. (1, 0, 1)
  15. (1, 0, 2)
  16. (1, 1, 0)
  17. (1, 1, 1)
  18. (1, 1, 2)
  19. (1, 2, 0)
  20. (1, 2, 1)
  21. (1, 2, 2)
  22. (2, 0, 0)
  23. (2, 0, 1)
  24. (2, 0, 2)
  25. (2, 1, 0)
  26. (2, 1, 1)
  27. (2, 1, 2)
  28. (2, 2, 0)
  29. (2, 2, 1)
  30. (2, 2, 2)
复制代码
它还有一个默认参数repeat=1,表示每个序列可以重复的次数
2、一直在更新PyQt5那个贴子,感觉对自己帮助也很大,估计要不是要完结那个贴,说不定,我就没有继续把那个教程学下去的动力了,好在它快完了,还有最后两章
3、最近因为自己的电脑太慢,要把程序拿到实验室电脑跑,学了一下打包,然后把经验写在这个贴里了
http://bbs.fishc.com/thread-60551-1-1.html
4、定义的函数的传入参数如果为列表,如果在函数体内对列表作任何改动,会直接改动传入的列表(和C与C++中传入指针类似),这是一个对于我们初学者来说很隐蔽的错误,有时候程序根本 不会报错,但是会得不到想要的结果





想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-23 23:48:34 From FishC Mobile | 显示全部楼层
鱼C是我家,爱护靠大家.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-26 22:50:20 | 显示全部楼层
之前写pyqt贴子的时候对于信号槽只是一知半解(虽然现在也是),不过又知道了一个新的东西,新的信号槽写法(指PyQt4.5之后)与之前很有不同,以前不知道怎么给槽函数传递参数,PyQt5中给槽函数传递参数的作法是这样的
  1. from PyQt5 import QtWidget, QtCore  


  2. class Test(QtWidget.QWidegt):
  3.     test_signal = QtCore.pyqtSignal(str)  # 定义信号,定义参数为str类型  
  4.     def __init__(self):
  5.         super(Test, self).__init__()
  6.         self.test_signal.connect(self.signal_fun)

  7.     def emit_signal(self):
  8.         self.test_signal.emit("我们来试验一下")  # 发射信号时,按信号定义的参数数量和类型传入参数

  9.     def signal_fun(self, string):  # 槽函数的参数也要与信号定义的参数列表相对应
  10.         print(string)
复制代码



        
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2015-4-27 02:36:13 From FishC Mobile | 显示全部楼层
好难哦,佩服!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-28 00:30:19 | 显示全部楼层
今天看到的一个小问题,自己也试了下~
  1. >>> test = dict('a', 1)
  2. Traceback (most recent call last):
  3.   File "<pyshell#17>", line 1, in <module>
  4.     test = dict('a', 1)
  5. TypeError: dict expected at most 1 arguments, got 2
  6. >>> test = dict((('a', 1),('b', 2, 3)))
  7. Traceback (most recent call last):
  8.   File "<pyshell#18>", line 1, in <module>
  9.     test = dict((('a', 1),('b', 2, 3)))
  10. ValueError: dictionary update sequence element #1 has length 3; 2 is required
  11. >>> test = dict((('a', 1)))
  12. Traceback (most recent call last):
  13.   File "<pyshell#19>", line 1, in <module>
  14.     test = dict((('a', 1)))
  15. ValueError: dictionary update sequence element #0 has length 1; 2 is required
  16. >>> test = dict((('a', 1),('b', 2)))
  17. >>> test
  18. {'b': 2, 'a': 1}
  19. >>> test = dict((['c', 1],['d', 2]))
  20. >>> test
  21. {'c': 1, 'd': 2}
  22. >>> test = dict([('e', 1),('f', 2)])
  23. >>> test
  24. {'f': 2, 'e': 1}
  25. >>> test = dict([['g', 1],['h', 2]])
  26. >>> test
  27. {'h': 2, 'g': 1}
复制代码

总结
通过dict类创建字典:
1、传入参数必须是一个(见第一个报错),
2、这个参数可以是列表,也可以是元组(见后面成功的例子),
3、作为参数的列表或元组中的元素必须是长度为2的列表或者元组(见第二个报错),
4、作为 参数的元组或者列表必须长度大于等于2(见第三个报错)


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-30 12:46:31 | 显示全部楼层
本帖最后由 lightninng 于 2015-4-30 15:55 编辑

三天没来了,今天看到了甲鱼之前转的一篇帖子,说到了代码整洁之道,看到了变量命名的问题,Python这门语言是有自己的书写代码的规范的,这从某种程度上有助于我们写出整洁的代码,但是还是有很多问题,最近遇到的一个问题就是PyQt5中的命名问题
PEP 8规范要求我们变量名和函数名均为小写字母、数字和下划线组成如:key_press_event
但是PyQt中的普遍做法是,驼峰型,即首单词小写,后续单词首字母大写如:keyPressEvent
在写PyQt那个贴子的过程中,我一直用的是PEP 8 中的写法,但是现在进行到最后一章,我恍然发现我看到的几个PyQt教程基本都是和PyQt模块本身相同的命名方法,有点迷茫,不知道大家怎么看
@~风介~ @戴宇轩@wei_Y
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-30 14:45:59 | 显示全部楼层
学习记录,看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-30 14:57:00 | 显示全部楼层
lightninng 发表于 2015-4-30 12:46
三天没来了,今天看到了甲鱼之前转的一篇帖子,说到了代码整洁之道,看到了变量命名的问题,Python这门语言 ...

之前也纠结过这个问题, 后来决定一律用小峰驼法。:)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-30 15:53:32 | 显示全部楼层

每节的红字都是问题,以及解决我解决这个问题的方法,有兴趣可以想想,然后发贴交流,相互学习嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 02:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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