鱼C论坛

 找回密码
 立即注册
查看: 3188|回复: 10

[已解决]鱼C论坛python精英挑战赛(05期)

[复制链接]
发表于 2017-7-3 11:33:42 | 显示全部楼层 |阅读模式
100鱼币
本帖最后由 jerryxjr1220 于 2017-7-7 16:49 编辑

本届挑战赛的最后一场比赛,获胜者将奖励200鱼币(由于系统设置最高悬赏只能是100,另外100鱼币获胜后补发)

本次比赛截止日期7月7日24时,评选仍然从新人中选拔优胜者。

由于本题是开放性命题,请说明程序思路,程序逻辑必须合理。评选标准:程序逻辑合理,运算效率高,程序有创意,代码简洁。

题目:女神的择偶标准

某档相亲节目中来了一位女神,她的择偶标准如下:外貌,身高,胖瘦,才能,收入
现在女神对8位追求的男士打了分,满分为1, 最低为0.
A    [0.8, 0.7, 0.6, 0.5, 0.2],
B    [0.7, 0.6, 0.5, 0.3, 0.5],
C    [0.8, 0.9, 0.6, 0.7, 0.5],
D    [0.6, 0.7, 0.8, 0.6, 0.6],
E    [0.5, 0.6, 0.8, 0.8, 0.4],
F    [0.9, 0.8, 0.7, 0.5, 0.6],
G    [0.5, 0.7, 0.7, 0.8, 0.7],
H    [0.6, 0.6, 0.6, 0.5, 0.5]
最终女神为C、D、F、G这4位男士亮了灯(符合女神的择偶标准)。

现在有另外2位候选人,女神对他们的打分为:
X    [0.6, 0.5, 0.8, 0.5, 0.7],
Y    [0.5, 0.6, 0.7, 0.6, 0.6]

问女神会为他们亮灯吗?

现在请你设计程序,输入女神打分的分值列表,例如X,Y,输出“亮灯”或“灭灯”。

提示:女神的最终评价标准的依据是对于外貌,身高,体重,才能,收入与其相应权重的乘积的总和。

注:此类题目被广泛运用在产品调研,大数据研究分析等领域,所以还是非常有研究价值的。

应某鱼油强烈要求,更新该女神照片一张

                               
登录/注册后可看大图



更新我的解答,利用keras+tensorflow后端的机器学习。
  1. from keras.models import Sequential
  2. from keras.layers import Dense, Activation
  3. import numpy as np

  4. matrix = [
  5.     [0.8, 0.7, 0.6, 0.5, 0.2],
  6.     [0.7, 0.6, 0.5, 0.3, 0.5],
  7.     [0.8, 0.9, 0.6, 0.7, 0.5],
  8.     [0.6, 0.7, 0.8, 0.6, 0.6],
  9.     [0.5, 0.6, 0.8, 0.8, 0.4],
  10.     [0.9, 0.8, 0.7, 0.5, 0.6],
  11.     [0.5, 0.7, 0.7, 0.8, 0.7],
  12.     [0.6, 0.6, 0.6, 0.5, 0.5]]
  13. concl = [[1, 0], [1, 0], [0, 1], [0, 1], [1, 0], [0, 1], [0, 1], [1, 0]]

  14. test = [[0.6, 0.5, 0.8, 0.5, 0.7],
  15.         [0.5, 0.6, 0.7, 0.6, 0.6]]

  16. x = np.array(matrix)  #训练数据集
  17. y = np.array(concl)   #分类结果:[灭灯,亮灯]

  18. model = Sequential()  #顺序连接层
  19. model.add(Dense(64, input_dim=5))   #全连接层,设置64个特征属性
  20. model.add(Activation('sigmoid'))    #sigmoid激励函数
  21. model.add(Dense(16))                #第二层全连接层,设置16个特征属性
  22. model.add(Activation('relu'))       #relu激励函数
  23. model.add(Dense(2))                 #收敛到2个分类
  24. model.add(Activation('softmax'))    #softmax针对于分类问题的激励函数

  25. model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])   #RMSprop优化器,categorical_crossentropy损失函数

  26. model.fit(x, y, batch_size=8, nb_epoch=1000, verbose=True)   #训练

  27. print(model.predict(test, batch_size=2, verbose=True))    #预测test集
复制代码


预测结果:
[[ 0.10033951  0.89966047]
[ 0.53344697  0.466553  ]]
最佳答案
2017-7-3 11:33:43
本帖最后由 WelanceLee 于 2017-7-6 10:50 编辑
  1. ## logistic regression
  2. import random
  3. import math

  4. ## p(x)实现了计算sigmoid函数的功能,
  5. ## 表示概率 p(被选择).如果概率大于
  6. ## 0.5则对应被选择,小于0.5就不会被
  7. ## 选择,这其实就是f(x)的功能

  8. def p(x):
  9.     h = mul(x, weights)
  10.     p = 1/(1+math.exp(-h))
  11.     return p

  12. def f(x):
  13.     if p(x) > 0.5:
  14.         print('女神可能会选你了!')
  15.     else:
  16.         print('女神可能不会选你了!')

  17. ## 实现向量点积
  18. def mul(a, b):
  19.     n = len(a)
  20.     s = 0
  21.     for i in range(n):
  22.         s += a[i]*b[i]
  23.     return s

  24. ## 这个是用梯度下降的方法求权重
  25. ## 比较关键的部分是确定损失函数
  26. ## 和对其求偏导,之后确定步长和迭
  27. ## 代次数(或者设计终止条件),就可
  28. ## 以得到比较满意的权重

  29. ## 这里的损失函数是对数概率损失
  30. ## 函数

  31. def gd(epochs, alpha = 0.1):
  32.     n = len(weights)
  33.     m = len(res)
  34.     for i in range(epochs):
  35.         for j in range(n):
  36.             delta = 0
  37.             for k in range(m):
  38.                 delta -= (res[k] - p(data[k]))*data[k][j]
  39.             weights[j] -= alpha*delta
  40.     return weights

  41. ## 对原始数据加上第0维,作为偏置项
  42. data = [[1, 0.8, 0.7, 0.6, 0.5, 0.2],
  43.             [1, 0.7, 0.6, 0.5, 0.3, 0.5],
  44.             [1, 0.8, 0.9, 0.6, 0.7, 0.5],
  45.             [1, 0.6, 0.7, 0.8, 0.6, 0.6],
  46.             [1, 0.5, 0.6, 0.8, 0.8, 0.4],
  47.             [1, 0.9, 0.8, 0.7, 0.5, 0.6],
  48.             [1, 0.5, 0.7, 0.7, 0.8, 0.7],
  49.             [1, 0.6, 0.6, 0.6, 0.5, 0.5]]
  50. res = [0, 0, 1, 1, 0, 1, 1, 0]

  51. ## 经验上权重初始化一般用一些小的随机数
  52. weights = [random.random() for _ in range(6)]

  53. ## 通过观察权重可以得出哪部分对结果影响大
  54. weights = gd(500)

  55. X = [1, 0.6, 0.5, 0.8, 0.5, 0.7]
  56. Y = [1, 0.5, 0.6, 0.7, 0.6, 0.6]
  57. f(X)
  58. f(Y)

  59. ## 各个指标的权值如下
  60. des = ['额外偏置','外貌','身高','胖瘦','才能','收入']
  61. d = dict((des[i], weights[i]) for i in range(len(weights)))
  62. print(sorted(d.items(), key = lambda x: x[1]))
复制代码

结果应该是都亮灯;我用的是逻辑斯特回归的方法,用已有的8个数据作为例子训练出合适的权重,然后在对X、Y做预测;从权重的结果看出,女神对于收入是最看重的,而对于外貌是不怎么看重的~这样的好消息,对于我来说还是然并卵啊

最佳答案

查看完整内容

结果应该是都亮灯;我用的是逻辑斯特回归的方法,用已有的8个数据作为例子训练出合适的权重,然后在对X、Y做预测;从权重的结果看出,女神对于收入是最看重的,而对于外貌是不怎么看重的~这样的好消息,对于我来说还是然并卵啊

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2017-7-3 11:33:43 | 显示全部楼层    本楼为最佳答案   
本帖最后由 WelanceLee 于 2017-7-6 10:50 编辑
  1. ## logistic regression
  2. import random
  3. import math

  4. ## p(x)实现了计算sigmoid函数的功能,
  5. ## 表示概率 p(被选择).如果概率大于
  6. ## 0.5则对应被选择,小于0.5就不会被
  7. ## 选择,这其实就是f(x)的功能

  8. def p(x):
  9.     h = mul(x, weights)
  10.     p = 1/(1+math.exp(-h))
  11.     return p

  12. def f(x):
  13.     if p(x) > 0.5:
  14.         print('女神可能会选你了!')
  15.     else:
  16.         print('女神可能不会选你了!')

  17. ## 实现向量点积
  18. def mul(a, b):
  19.     n = len(a)
  20.     s = 0
  21.     for i in range(n):
  22.         s += a[i]*b[i]
  23.     return s

  24. ## 这个是用梯度下降的方法求权重
  25. ## 比较关键的部分是确定损失函数
  26. ## 和对其求偏导,之后确定步长和迭
  27. ## 代次数(或者设计终止条件),就可
  28. ## 以得到比较满意的权重

  29. ## 这里的损失函数是对数概率损失
  30. ## 函数

  31. def gd(epochs, alpha = 0.1):
  32.     n = len(weights)
  33.     m = len(res)
  34.     for i in range(epochs):
  35.         for j in range(n):
  36.             delta = 0
  37.             for k in range(m):
  38.                 delta -= (res[k] - p(data[k]))*data[k][j]
  39.             weights[j] -= alpha*delta
  40.     return weights

  41. ## 对原始数据加上第0维,作为偏置项
  42. data = [[1, 0.8, 0.7, 0.6, 0.5, 0.2],
  43.             [1, 0.7, 0.6, 0.5, 0.3, 0.5],
  44.             [1, 0.8, 0.9, 0.6, 0.7, 0.5],
  45.             [1, 0.6, 0.7, 0.8, 0.6, 0.6],
  46.             [1, 0.5, 0.6, 0.8, 0.8, 0.4],
  47.             [1, 0.9, 0.8, 0.7, 0.5, 0.6],
  48.             [1, 0.5, 0.7, 0.7, 0.8, 0.7],
  49.             [1, 0.6, 0.6, 0.6, 0.5, 0.5]]
  50. res = [0, 0, 1, 1, 0, 1, 1, 0]

  51. ## 经验上权重初始化一般用一些小的随机数
  52. weights = [random.random() for _ in range(6)]

  53. ## 通过观察权重可以得出哪部分对结果影响大
  54. weights = gd(500)

  55. X = [1, 0.6, 0.5, 0.8, 0.5, 0.7]
  56. Y = [1, 0.5, 0.6, 0.7, 0.6, 0.6]
  57. f(X)
  58. f(Y)

  59. ## 各个指标的权值如下
  60. des = ['额外偏置','外貌','身高','胖瘦','才能','收入']
  61. d = dict((des[i], weights[i]) for i in range(len(weights)))
  62. print(sorted(d.items(), key = lambda x: x[1]))
复制代码

结果应该是都亮灯;我用的是逻辑斯特回归的方法,用已有的8个数据作为例子训练出合适的权重,然后在对X、Y做预测;从权重的结果看出,女神对于收入是最看重的,而对于外貌是不怎么看重的~这样的好消息,对于我来说还是然并卵啊

评分

参与人数 2荣誉 +5 鱼币 +10 贡献 +2 收起 理由
jerryxjr1220 + 5 + 5 + 2 答题奖励
SixPy + 5 热爱鱼C^_^

查看全部评分

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

使用道具 举报

 楼主| 发表于 2017-7-3 11:37:15 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-4 09:05:37 | 显示全部楼层
此题扯淡解法:
根据 计算
print sum(C) ,sum(D),sum(F) ,sum(G)
print sum(A) ,sum(B) ,sum(E)  , sum(H)
得出:
3.5 3.3 3.5 3.4 # C D F G 被选中
2.8 2.6 3.1 2.8 # A B E H 被淘汰
可以看出 此女 选择的是 总得分高的,还要啥权重?
外貌,身高,体重,才能,收入, 单项都是浮云,谁的总分高 就选谁
所以如果非得在 X Y中选一个 显然选X,当然也不能排除此女俩个都不选,继续物色更好的。
因此:此女眼光很高。。。。。一看就是上过非诚勿扰的选手。。
坐等楼主上此女的图片,无图无真相。

回答完毕,坐等楼下精彩回答。

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
jerryxjr1220 + 5 + 5 + 3 你的解答还是很有创意的!

查看全部评分

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

使用道具 举报

发表于 2017-7-4 09:31:08 | 显示全部楼层
本帖最后由 小锟 于 2017-7-5 09:16 编辑

  1. #-*- coding:utf-8 -*-
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. x = np.array(   [ [0.8, 0.7, 0.6, 0.5, 0.2],
  5.     [0.7, 0.6, 0.5, 0.3, 0.5],
  6.     [0.8, 0.9, 0.6, 0.7, 0.5],
  7.     [0.6, 0.7, 0.8, 0.6, 0.6],
  8.     [0.5, 0.6, 0.8, 0.8, 0.4],
  9.     [0.9, 0.8, 0.7, 0.5, 0.6],
  10.     [0.5, 0.7, 0.7, 0.8, 0.7],
  11.     [0.6, 0.6, 0.6, 0.5, 0.5]])


  12. #y是结果,0代表灭灯,1代表亮灯
  13. y = np.array([0,0,1,1,0,1,1,0])

  14. print ('均值:' , x.mean(axis = 0))
  15. print ('标准差' , x.std(axis = 0))


  16. #观察x数值范围在0-1之间,且标准差相差不大
  17. #不考虑标准化和简单降维处理

  18. #分为训练集跟测试集,比例为0.2,分层抽样
  19. from sklearn.model_selection import train_test_split
  20. x_train ,x_test , y_train ,y_test = train_test_split(x,y,test_size=0.2,random_state=0,stratify = y)
  21. print('x_train:',x_train)
  22. print('x_test:',x_test)
  23. print('y_train:',y_train)
  24. print('y_test:',y_test)


  25. #我们希望将结果分为2类,且希望预测其他的数据,采用SVM分类方法,得到一条直线,
  26. #使这条直线离2类最近的点的距离最远

  27. from sklearn import svm
  28. svs = svm.LinearSVC()
  29. svs.fit(x_train,y_train)
  30. print('train',svs.score(x_train,y_train))
  31. print('test',svs.score(x_test,y_test))

  32. #发现其结果不是很好,进行调参

  33. #损失函数的影响
  34. losses = ['hinge','squared_hinge']
  35. for loss in losses:
  36.     svs = svm.LinearSVC(loss = loss)
  37.     svs.fit(x_train,y_train)
  38.     print('train',svs.score(x_train,y_train))
  39.     print('test',svs.score(x_test,y_test))

  40. #正则化方法的影响
  41. L12 = ['l1','l2']
  42. for p in L12:
  43.     svs = svm.LinearSVC(penalty=p,dual=False)
  44.     svs.fit(x_train,y_train)
  45.     print('train',svs.score(x_train,y_train))
  46.     print('test',svs.score(x_test,y_test))

  47. #系数C的影响
  48.    
  49. Cs = np.logspace(-2,1)
  50. train_scores = []
  51. test_scores = []
  52. for C in Cs:
  53.     svs = svm.LinearSVC( C = C )
  54.     svs.fit(x_train,y_train)
  55.     train_scores.append(svs.score(x_train,y_train))
  56.     test_scores.append(svs.score(x_test,y_test))
  57. fig = plt.figure()
  58. ax = fig.add_subplot(1,1,1)
  59. ax.plot(Cs,train_scores,label = 'train score')
  60. ax.plot(Cs,test_scores,label = 'test score')
  61. ax.set_xlabel(r'C')
  62. ax.set_ylabel(r'score')
  63. ax.set_xscale('log')
  64. ax.legend(loc = 'best')
  65. plt.show()



  66. #我们用C = 2.1来进行预测

  67. svs = svm.LinearSVC(C = 2.1)
  68. svs.fit(x_train,y_train)
  69. print ('Coeff:%s,int:%s' % (svs.coef_,svs.intercept_))
  70. print('train',svs.score(x_train,y_train))
  71. print('test',svs.score(x_test,y_test))

  72. #上面的训练集和测试集的准确率都是100%

  73. bianliang = svs.coef_.tolist()[0]
  74. #返回权重
  75. for i in range(len(bianliang)):
  76.     print ('x',i+1,':%.2f ' % (bianliang[i]),'    ' ,end='')
  77. print ('c:%.2f'%(svs.intercept_[0]))

  78. #返回排序后的权重
  79. seat = np.argsort(svs.coef_)[0][-1::-1]
  80. vaules = [svs.coef_[0][i] for i in seat]
  81. for i ,j in zip(seat,vaules):
  82.     print ('x',i+1,':%.2f ' % (j),'    ',end='')
  83. #观察排序后的权重,可以得知该女士基本择偶条件看重
  84. #外貌,身高,收入,如果这是相亲网站的话,可以为她推荐前面的3个条件较好的人

  85. #预测x和y,先将他们合并成x_p
  86. x_p = np.array([[0.6, 0.5, 0.8, 0.5, 0.7],
  87.                 [0.5, 0.6, 0.7, 0.6, 0.6]])
  88. y_true = svs.predict(x_p)
  89. result = ['灭灯','亮灯']
  90. print ('结果', [result[i] for i in y_true ])



复制代码

评分

参与人数 2荣誉 +5 鱼币 +10 贡献 +2 收起 理由
jerryxjr1220 + 5 + 5 + 2 答题奖励
SixPy + 5 热爱鱼C^_^

查看全部评分

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

使用道具 举报

发表于 2017-7-4 10:01:49 | 显示全部楼层
此题扯淡解法2:
用matplotlib 画出八个男嘉宾的各项得分图:
S398B4_025YKAJGO7JV_]21.png
女子对于 男生得好评度依次是:
身高>>收入>>外貌>>才能>>体重

因为不会数据分析,所以不知道怎么计算权重,就主观给个权中值把
身高,收入,外貌,才能,体重 :0.4 0.3 0.15 0.1 0.05
计算 X Y A B C D E F G H
得加权总得分
qz = [0.15, 0.4 ,0.05 ,0.1 ,0.3]
print 'X',sum(map(lambda x,y:x*y,X,qz))
print 'Y',sum(map(lambda x,y:x*y,Y,qz))
print 'C',sum(map(lambda x,y:x*y,C,qz))
print 'D',sum(map(lambda x,y:x*y,D,qz))
print 'F',sum(map(lambda x,y:x*y,F,qz))
print 'G',sum(map(lambda x,y:x*y,G,qz))
print 'A',sum(map(lambda x,y:x*y,A,qz))
print 'B',sum(map(lambda x,y:x*y,B,qz))
print 'E',sum(map(lambda x,y:x*y,E,qz))
print 'H',sum(map(lambda x,y:x*y,H,qz))
-------------------
X 0.59
Y 0.59
--------选中-------
C 0.73
D 0.65
F 0.72
G 0.68
---------淘汰---------
A 0.54
B 0.55
E 0.555
H 0.56
因为X Y 得分都没有达到此女心目中的高富帅的最低标准,所以惨遭淘汰。
由此再次证明:不是高富帅 就不要去非诚勿扰了。
再次强烈要求楼主上此女图,无图无真相。。。。。。

评分

参与人数 2荣誉 +5 鱼币 +10 贡献 +2 收起 理由
jerryxjr1220 + 5 + 5 + 2 答题奖励
SixPy + 5 哈哈哈哈~

查看全部评分

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

使用道具 举报

发表于 2017-7-5 09:24:40 | 显示全部楼层
楼主 ,你调皮了 她不是女神,她叫如花,孟非 不会让她进非诚勿扰的
---------------------------------------------------------------
这题真的很有意思,也很有意义。
哎,只是为啥 回答的人这么少呢。鱼友都跑哪去了?
我还想借鉴哈别人的思路,完善我的 此题扯淡解法3 呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-7-5 09:56:10 From FishC Mobile | 显示全部楼层
本帖最后由 jerryxjr1220 于 2017-7-5 09:57 编辑
lovesword 发表于 2017-7-5 09:24
楼主 ,你调皮了 她不是女神,她叫如花,孟非 不会让她进非诚勿扰的
----------------------------------- ...


凤姐都上过相亲节目,为啥如花不能?

上面回复的鱼油的解答质量都非常高!可以借鉴!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-7 09:19:15 | 显示全部楼层
只有满分为1分才亮灯吗
,还是大于某个数值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-7-7 09:32:27 | 显示全部楼层
sunnychou 发表于 2017-7-7 09:19
只有满分为1分才亮灯吗
,还是大于某个数值

肯定不是满分才亮灯啊,里面没有人是满分的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-7-7 16:50:03 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2017-7-7 16:57 编辑

更新我的解答:
  1. from keras.models import Sequential
  2. from keras.layers import Dense, Activation
  3. import numpy as np

  4. matrix = [
  5.     [0.8, 0.7, 0.6, 0.5, 0.2],
  6.     [0.7, 0.6, 0.5, 0.3, 0.5],
  7.     [0.8, 0.9, 0.6, 0.7, 0.5],
  8.     [0.6, 0.7, 0.8, 0.6, 0.6],
  9.     [0.5, 0.6, 0.8, 0.8, 0.4],
  10.     [0.9, 0.8, 0.7, 0.5, 0.6],
  11.     [0.5, 0.7, 0.7, 0.8, 0.7],
  12.     [0.6, 0.6, 0.6, 0.5, 0.5]]
  13. concl = [[1, 0], [1, 0], [0, 1], [0, 1], [1, 0], [0, 1], [0, 1], [1, 0]]

  14. test = [[0.6, 0.5, 0.8, 0.5, 0.7],
  15.         [0.5, 0.6, 0.7, 0.6, 0.6]]

  16. x = np.array(matrix)  #训练数据集
  17. y = np.array(concl)   #分类结果:[灭灯,亮灯]

  18. model = Sequential()  #顺序连接层
  19. model.add(Dense(64, input_dim=5))   #全连接层,设置64个特征属性
  20. model.add(Activation('sigmoid'))    #sigmoid激励函数
  21. model.add(Dense(16))                #第二层全连接层,设置16个特征属性
  22. model.add(Activation('relu'))       #relu激励函数
  23. model.add(Dense(2))                 #收敛到2个分类
  24. model.add(Activation('softmax'))    #softmax针对于分类问题的激励函数

  25. model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])   #RMSprop优化器,categorical_crossentropy损失函数

  26. model.fit(x, y, batch_size=8, nb_epoch=1000, verbose=True)   #训练

  27. print(model.predict(test, batch_size=2, verbose=True))    #预测test集
复制代码


预测结果:
[[ 0.10033951  0.89966047]
[ 0.53344697  0.466553  ]]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-28 19:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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