本帖最后由 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后端的机器学习。
- from keras.models import Sequential
- from keras.layers import Dense, Activation
- import numpy as np
- matrix = [
- [0.8, 0.7, 0.6, 0.5, 0.2],
- [0.7, 0.6, 0.5, 0.3, 0.5],
- [0.8, 0.9, 0.6, 0.7, 0.5],
- [0.6, 0.7, 0.8, 0.6, 0.6],
- [0.5, 0.6, 0.8, 0.8, 0.4],
- [0.9, 0.8, 0.7, 0.5, 0.6],
- [0.5, 0.7, 0.7, 0.8, 0.7],
- [0.6, 0.6, 0.6, 0.5, 0.5]]
- concl = [[1, 0], [1, 0], [0, 1], [0, 1], [1, 0], [0, 1], [0, 1], [1, 0]]
- test = [[0.6, 0.5, 0.8, 0.5, 0.7],
- [0.5, 0.6, 0.7, 0.6, 0.6]]
- x = np.array(matrix) #训练数据集
- y = np.array(concl) #分类结果:[灭灯,亮灯]
- model = Sequential() #顺序连接层
- model.add(Dense(64, input_dim=5)) #全连接层,设置64个特征属性
- model.add(Activation('sigmoid')) #sigmoid激励函数
- model.add(Dense(16)) #第二层全连接层,设置16个特征属性
- model.add(Activation('relu')) #relu激励函数
- model.add(Dense(2)) #收敛到2个分类
- model.add(Activation('softmax')) #softmax针对于分类问题的激励函数
- model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy']) #RMSprop优化器,categorical_crossentropy损失函数
- model.fit(x, y, batch_size=8, nb_epoch=1000, verbose=True) #训练
- print(model.predict(test, batch_size=2, verbose=True)) #预测test集
复制代码
预测结果:
[[ 0.10033951 0.89966047]
[ 0.53344697 0.466553 ]]
本帖最后由 WelanceLee 于 2017-7-6 10:50 编辑
- ## logistic regression
- import random
- import math
- ## p(x)实现了计算sigmoid函数的功能,
- ## 表示概率 p(被选择).如果概率大于
- ## 0.5则对应被选择,小于0.5就不会被
- ## 选择,这其实就是f(x)的功能
- def p(x):
- h = mul(x, weights)
- p = 1/(1+math.exp(-h))
- return p
- def f(x):
- if p(x) > 0.5:
- print('女神可能会选你了!')
- else:
- print('女神可能不会选你了!')
- ## 实现向量点积
- def mul(a, b):
- n = len(a)
- s = 0
- for i in range(n):
- s += a[i]*b[i]
- return s
- ## 这个是用梯度下降的方法求权重
- ## 比较关键的部分是确定损失函数
- ## 和对其求偏导,之后确定步长和迭
- ## 代次数(或者设计终止条件),就可
- ## 以得到比较满意的权重
- ## 这里的损失函数是对数概率损失
- ## 函数
- def gd(epochs, alpha = 0.1):
- n = len(weights)
- m = len(res)
- for i in range(epochs):
- for j in range(n):
- delta = 0
- for k in range(m):
- delta -= (res[k] - p(data[k]))*data[k][j]
- weights[j] -= alpha*delta
- return weights
- ## 对原始数据加上第0维,作为偏置项
- data = [[1, 0.8, 0.7, 0.6, 0.5, 0.2],
- [1, 0.7, 0.6, 0.5, 0.3, 0.5],
- [1, 0.8, 0.9, 0.6, 0.7, 0.5],
- [1, 0.6, 0.7, 0.8, 0.6, 0.6],
- [1, 0.5, 0.6, 0.8, 0.8, 0.4],
- [1, 0.9, 0.8, 0.7, 0.5, 0.6],
- [1, 0.5, 0.7, 0.7, 0.8, 0.7],
- [1, 0.6, 0.6, 0.6, 0.5, 0.5]]
- res = [0, 0, 1, 1, 0, 1, 1, 0]
- ## 经验上权重初始化一般用一些小的随机数
- weights = [random.random() for _ in range(6)]
- ## 通过观察权重可以得出哪部分对结果影响大
- weights = gd(500)
- X = [1, 0.6, 0.5, 0.8, 0.5, 0.7]
- Y = [1, 0.5, 0.6, 0.7, 0.6, 0.6]
- f(X)
- f(Y)
- ## 各个指标的权值如下
- des = ['额外偏置','外貌','身高','胖瘦','才能','收入']
- d = dict((des[i], weights[i]) for i in range(len(weights)))
- print(sorted(d.items(), key = lambda x: x[1]))
复制代码
结果应该是都亮灯;我用的是逻辑斯特回归的方法,用已有的8个数据作为例子训练出合适的权重,然后在对X、Y做预测;从权重的结果看出,女神对于收入是最看重的,而对于外貌是不怎么看重的~这样的好消息,对于我来说还是然并卵啊
|